activity for future avatar publications. not working yet
This commit is contained in:
		
							parent
							
								
									88d1bd356c
								
							
						
					
					
						commit
						daab16bdef
					
				| 
						 | 
					@ -0,0 +1,87 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
				
			||||||
 | 
					    android:layout_width="match_parent"
 | 
				
			||||||
 | 
					    android:layout_height="match_parent"
 | 
				
			||||||
 | 
					    android:background="@color/primarybackground" >
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <LinearLayout
 | 
				
			||||||
 | 
					        android:id="@+id/account_image_wrapper"
 | 
				
			||||||
 | 
					        android:layout_width="wrap_content"
 | 
				
			||||||
 | 
					        android:layout_height="wrap_content"
 | 
				
			||||||
 | 
					        android:layout_alignParentTop="true"
 | 
				
			||||||
 | 
					        android:layout_centerHorizontal="true"
 | 
				
			||||||
 | 
					        android:layout_marginBottom="8dp"
 | 
				
			||||||
 | 
					        android:layout_marginTop="24dp"
 | 
				
			||||||
 | 
					        android:background="@drawable/message_border" >
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <ImageView
 | 
				
			||||||
 | 
					            android:id="@+id/account_image"
 | 
				
			||||||
 | 
					            android:layout_width="194dp"
 | 
				
			||||||
 | 
					            android:layout_height="194dp" />
 | 
				
			||||||
 | 
					    </LinearLayout>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <TextView
 | 
				
			||||||
 | 
					        android:id="@+id/hint"
 | 
				
			||||||
 | 
					        android:layout_width="wrap_content"
 | 
				
			||||||
 | 
					        android:layout_height="wrap_content"
 | 
				
			||||||
 | 
					        android:layout_below="@id/account_image_wrapper"
 | 
				
			||||||
 | 
					        android:layout_centerHorizontal="true"
 | 
				
			||||||
 | 
					        android:text="@string/touch_to_choose_picture"
 | 
				
			||||||
 | 
					        android:textColor="@color/secondarytext" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <LinearLayout
 | 
				
			||||||
 | 
					        android:id="@+id/button_bar"
 | 
				
			||||||
 | 
					        android:layout_width="wrap_content"
 | 
				
			||||||
 | 
					        android:layout_height="wrap_content"
 | 
				
			||||||
 | 
					        android:layout_alignParentBottom="true"
 | 
				
			||||||
 | 
					        android:layout_alignParentLeft="true"
 | 
				
			||||||
 | 
					        android:layout_alignParentRight="true" >
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <Button
 | 
				
			||||||
 | 
					            android:id="@+id/cancel_button"
 | 
				
			||||||
 | 
					            style="?android:attr/borderlessButtonStyle"
 | 
				
			||||||
 | 
					            android:layout_width="0dp"
 | 
				
			||||||
 | 
					            android:layout_height="wrap_content"
 | 
				
			||||||
 | 
					            android:layout_weight="1"
 | 
				
			||||||
 | 
					            android:text="@string/cancel"
 | 
				
			||||||
 | 
					            android:textColor="@color/primarytext" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <View
 | 
				
			||||||
 | 
					            android:layout_width="1dp"
 | 
				
			||||||
 | 
					            android:layout_height="fill_parent"
 | 
				
			||||||
 | 
					            android:layout_marginBottom="7dp"
 | 
				
			||||||
 | 
					            android:layout_marginTop="7dp"
 | 
				
			||||||
 | 
					            android:background="@color/divider" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <Button
 | 
				
			||||||
 | 
					            android:id="@+id/publish_button"
 | 
				
			||||||
 | 
					            style="?android:attr/borderlessButtonStyle"
 | 
				
			||||||
 | 
					            android:layout_width="0dp"
 | 
				
			||||||
 | 
					            android:layout_height="wrap_content"
 | 
				
			||||||
 | 
					            android:layout_weight="1"
 | 
				
			||||||
 | 
					            android:enabled="false"
 | 
				
			||||||
 | 
					            android:text="@string/publish_avatar"
 | 
				
			||||||
 | 
					            android:textColor="@color/secondarytext" />
 | 
				
			||||||
 | 
					    </LinearLayout>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <LinearLayout
 | 
				
			||||||
 | 
					        android:layout_width="wrap_content"
 | 
				
			||||||
 | 
					        android:layout_height="fill_parent"
 | 
				
			||||||
 | 
					        android:layout_above="@+id/button_bar"
 | 
				
			||||||
 | 
					        android:layout_below="@+id/hint"
 | 
				
			||||||
 | 
					        android:layout_centerHorizontal="true"
 | 
				
			||||||
 | 
					        android:gravity="center_vertical"
 | 
				
			||||||
 | 
					        android:orientation="vertical"
 | 
				
			||||||
 | 
					        android:paddingLeft="8dp"
 | 
				
			||||||
 | 
					        android:paddingRight="8dp" >
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <TextView
 | 
				
			||||||
 | 
					            android:id="@+id/explanation"
 | 
				
			||||||
 | 
					            android:layout_width="wrap_content"
 | 
				
			||||||
 | 
					            android:layout_height="wrap_content"
 | 
				
			||||||
 | 
					            android:text="@string/publish_avatar_explanation"
 | 
				
			||||||
 | 
					            android:textColor="@color/primarytext"
 | 
				
			||||||
 | 
					            android:textSize="18sp" />
 | 
				
			||||||
 | 
					    </LinearLayout>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</RelativeLayout>
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,8 @@
 | 
				
			||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
					<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
				
			||||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
					    xmlns:tools="http://schemas.android.com/tools"
 | 
				
			||||||
    android:layout_width="fill_parent"
 | 
					    android:layout_width="fill_parent"
 | 
				
			||||||
    android:layout_height="fill_parent" >
 | 
					    android:layout_height="fill_parent"
 | 
				
			||||||
 | 
					    android:background="@color/primarybackground">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <ListView
 | 
					    <ListView
 | 
				
			||||||
        android:id="@+id/account_list"
 | 
					        android:id="@+id/account_list"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,6 +24,10 @@
 | 
				
			||||||
        android:id="@+id/mgmt_account_announce_pgp"
 | 
					        android:id="@+id/mgmt_account_announce_pgp"
 | 
				
			||||||
        android:showAsAction="never"
 | 
					        android:showAsAction="never"
 | 
				
			||||||
        android:title="@string/announce_pgp"/>
 | 
					        android:title="@string/announce_pgp"/>
 | 
				
			||||||
 | 
					    <item
 | 
				
			||||||
 | 
					        android:id="@+id/mgmt_account_publish_avatar"
 | 
				
			||||||
 | 
					        android:showAsAction="never"
 | 
				
			||||||
 | 
					        android:title="@string/publish_avatar"/>
 | 
				
			||||||
    <item
 | 
					    <item
 | 
				
			||||||
        android:id="@+id/mgmt_otr_key"
 | 
					        android:id="@+id/mgmt_otr_key"
 | 
				
			||||||
        android:showAsAction="never"
 | 
					        android:showAsAction="never"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -268,4 +268,7 @@
 | 
				
			||||||
    <string name="contact_added_you">Contact added you to contact list</string>
 | 
					    <string name="contact_added_you">Contact added you to contact list</string>
 | 
				
			||||||
    <string name="add_back">Add back</string>
 | 
					    <string name="add_back">Add back</string>
 | 
				
			||||||
    <string name="contact_has_read_up_to_this_point">%s has read up to this point</string>
 | 
					    <string name="contact_has_read_up_to_this_point">%s has read up to this point</string>
 | 
				
			||||||
 | 
					    <string name="publish_avatar">Publish avatar</string>
 | 
				
			||||||
 | 
					    <string name="touch_to_choose_picture">Touch avatar to select picture from gallary</string>
 | 
				
			||||||
 | 
					    <string name="publish_avatar_explanation">Publish avatar for <b>%s</b>. Everyone subscribed to your presence updates will also be able to see this picture.</string>
 | 
				
			||||||
</resources>
 | 
					</resources>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,7 @@
 | 
				
			||||||
package eu.siacs.conversations.persistance;
 | 
					package eu.siacs.conversations.persistance;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.ByteArrayInputStream;
 | 
				
			||||||
 | 
					import java.io.ByteArrayOutputStream;
 | 
				
			||||||
import java.io.File;
 | 
					import java.io.File;
 | 
				
			||||||
import java.io.FileInputStream;
 | 
					import java.io.FileInputStream;
 | 
				
			||||||
import java.io.FileNotFoundException;
 | 
					import java.io.FileNotFoundException;
 | 
				
			||||||
| 
						 | 
					@ -7,19 +9,28 @@ import java.io.FileOutputStream;
 | 
				
			||||||
import java.io.IOException;
 | 
					import java.io.IOException;
 | 
				
			||||||
import java.io.InputStream;
 | 
					import java.io.InputStream;
 | 
				
			||||||
import java.io.OutputStream;
 | 
					import java.io.OutputStream;
 | 
				
			||||||
 | 
					import java.security.DigestOutputStream;
 | 
				
			||||||
 | 
					import java.security.MessageDigest;
 | 
				
			||||||
 | 
					import java.security.NoSuchAlgorithmException;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import android.content.Context;
 | 
					import android.content.Context;
 | 
				
			||||||
import android.graphics.Bitmap;
 | 
					import android.graphics.Bitmap;
 | 
				
			||||||
import android.graphics.BitmapFactory;
 | 
					import android.graphics.BitmapFactory;
 | 
				
			||||||
 | 
					import android.graphics.Canvas;
 | 
				
			||||||
import android.graphics.Matrix;
 | 
					import android.graphics.Matrix;
 | 
				
			||||||
 | 
					import android.graphics.RectF;
 | 
				
			||||||
import android.media.ExifInterface;
 | 
					import android.media.ExifInterface;
 | 
				
			||||||
import android.net.Uri;
 | 
					import android.net.Uri;
 | 
				
			||||||
 | 
					import android.util.Base64;
 | 
				
			||||||
 | 
					import android.util.Base64OutputStream;
 | 
				
			||||||
import android.util.Log;
 | 
					import android.util.Log;
 | 
				
			||||||
import android.util.LruCache;
 | 
					import android.util.LruCache;
 | 
				
			||||||
import eu.siacs.conversations.R;
 | 
					import eu.siacs.conversations.R;
 | 
				
			||||||
import eu.siacs.conversations.entities.Conversation;
 | 
					import eu.siacs.conversations.entities.Conversation;
 | 
				
			||||||
import eu.siacs.conversations.entities.Message;
 | 
					import eu.siacs.conversations.entities.Message;
 | 
				
			||||||
 | 
					import eu.siacs.conversations.utils.CryptoHelper;
 | 
				
			||||||
import eu.siacs.conversations.xmpp.jingle.JingleFile;
 | 
					import eu.siacs.conversations.xmpp.jingle.JingleFile;
 | 
				
			||||||
 | 
					import eu.siacs.conversations.xmpp.pep.Avatar;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class FileBackend {
 | 
					public class FileBackend {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -215,10 +226,102 @@ public class FileBackend {
 | 
				
			||||||
	public File getIncomingFile() {
 | 
						public File getIncomingFile() {
 | 
				
			||||||
		return new File(context.getFilesDir().getAbsolutePath() + "/incoming");
 | 
							return new File(context.getFilesDir().getAbsolutePath() + "/incoming");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	public Uri getIncomingUri() {
 | 
						public Uri getIncomingUri() {
 | 
				
			||||||
		return Uri.parse(context.getFilesDir().getAbsolutePath() + "/incoming");
 | 
							return Uri.parse(context.getFilesDir().getAbsolutePath() + "/incoming");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public Avatar getPepAvatar(Uri image, int size, Bitmap.CompressFormat format) {
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								Avatar avatar = new Avatar();
 | 
				
			||||||
 | 
								Bitmap bm = cropCenterSquare(image, size);
 | 
				
			||||||
 | 
								ByteArrayOutputStream mByteArrayOutputStream = new ByteArrayOutputStream();
 | 
				
			||||||
 | 
								Base64OutputStream mBase64OutputSttream = new Base64OutputStream(mByteArrayOutputStream, Base64.DEFAULT);
 | 
				
			||||||
 | 
								MessageDigest digest = MessageDigest.getInstance("SHA-1");
 | 
				
			||||||
 | 
								DigestOutputStream mDigestOutputStream = new DigestOutputStream(mBase64OutputSttream, digest);
 | 
				
			||||||
 | 
								bm.compress(format, 75, mDigestOutputStream);
 | 
				
			||||||
 | 
								avatar.sha1sum = CryptoHelper.bytesToHex(digest.digest());
 | 
				
			||||||
 | 
								avatar.image = new String(mByteArrayOutputStream.toByteArray());
 | 
				
			||||||
 | 
								return avatar;
 | 
				
			||||||
 | 
							} catch (NoSuchAlgorithmException e) {
 | 
				
			||||||
 | 
								return null;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public void save(Avatar avatar) {
 | 
				
			||||||
 | 
							String path = context.getFilesDir().getAbsolutePath() + "/avatars/";
 | 
				
			||||||
 | 
							File file = new File(path+"/"+avatar.getFilename());
 | 
				
			||||||
 | 
							file.getParentFile().mkdirs();
 | 
				
			||||||
 | 
							Log.d("xmppService",file.getAbsolutePath());
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								file.createNewFile();
 | 
				
			||||||
 | 
								FileOutputStream mFileOutputStream = new FileOutputStream(file);
 | 
				
			||||||
 | 
								MessageDigest digest = MessageDigest.getInstance("SHA-1");
 | 
				
			||||||
 | 
								DigestOutputStream mDigestOutputStream = new DigestOutputStream(mFileOutputStream, digest);
 | 
				
			||||||
 | 
								mDigestOutputStream.write(avatar.getImageAsBytes());
 | 
				
			||||||
 | 
								mDigestOutputStream.flush();
 | 
				
			||||||
 | 
								mDigestOutputStream.close();
 | 
				
			||||||
 | 
								Log.d("xmppService","sha1sum after write: "+CryptoHelper.bytesToHex(digest.digest()));
 | 
				
			||||||
 | 
							} catch (FileNotFoundException e) {
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
							} catch (IOException e) {
 | 
				
			||||||
 | 
								Log.d("xmppService",e.getMessage());
 | 
				
			||||||
 | 
							} catch (NoSuchAlgorithmException e) {
 | 
				
			||||||
 | 
								// TODO Auto-generated catch block
 | 
				
			||||||
 | 
								e.printStackTrace();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public Bitmap cropCenterSquare(Uri image, int size) {
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								BitmapFactory.Options options = new BitmapFactory.Options();
 | 
				
			||||||
 | 
								options.inSampleSize = calcSampleSize(image, size);
 | 
				
			||||||
 | 
								InputStream is = context.getContentResolver()
 | 
				
			||||||
 | 
										.openInputStream(image);
 | 
				
			||||||
 | 
								Bitmap input = BitmapFactory.decodeStream(is, null, options);
 | 
				
			||||||
 | 
								int w = input.getWidth();
 | 
				
			||||||
 | 
								int h = input.getHeight();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								float scale = Math.max((float) size / h, (float) size / w);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								float outWidth = scale * w;
 | 
				
			||||||
 | 
								float outHeight = scale * h;
 | 
				
			||||||
 | 
								float left = (size - outWidth) / 2;
 | 
				
			||||||
 | 
								float top = (size - outHeight) / 2;
 | 
				
			||||||
 | 
								RectF target = new RectF(left, top, left + outWidth, top
 | 
				
			||||||
 | 
										+ outHeight);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								Bitmap output = Bitmap.createBitmap(size, size, input.getConfig());
 | 
				
			||||||
 | 
								Canvas canvas = new Canvas(output);
 | 
				
			||||||
 | 
								canvas.drawBitmap(input, null, target, null);
 | 
				
			||||||
 | 
								return output;
 | 
				
			||||||
 | 
							} catch (FileNotFoundException e) {
 | 
				
			||||||
 | 
								return null;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private int calcSampleSize(Uri image, int size)
 | 
				
			||||||
 | 
								throws FileNotFoundException {
 | 
				
			||||||
 | 
							BitmapFactory.Options options = new BitmapFactory.Options();
 | 
				
			||||||
 | 
							options.inJustDecodeBounds = true;
 | 
				
			||||||
 | 
							BitmapFactory.decodeStream(context.getContentResolver()
 | 
				
			||||||
 | 
									.openInputStream(image), null, options);
 | 
				
			||||||
 | 
							int height = options.outHeight;
 | 
				
			||||||
 | 
							int width = options.outWidth;
 | 
				
			||||||
 | 
							int inSampleSize = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (height > size || width > size) {
 | 
				
			||||||
 | 
								int halfHeight = height / 2;
 | 
				
			||||||
 | 
								int halfWidth = width / 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								while ((halfHeight / inSampleSize) > size
 | 
				
			||||||
 | 
										&& (halfWidth / inSampleSize) > size) {
 | 
				
			||||||
 | 
									inSampleSize *= 2;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return inSampleSize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public class ImageCopyException extends Exception {
 | 
						public class ImageCopyException extends Exception {
 | 
				
			||||||
		private static final long serialVersionUID = -1010013599132881427L;
 | 
							private static final long serialVersionUID = -1010013599132881427L;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -53,6 +53,7 @@ import eu.siacs.conversations.xmpp.XmppConnection;
 | 
				
			||||||
import eu.siacs.conversations.xmpp.jingle.JingleConnectionManager;
 | 
					import eu.siacs.conversations.xmpp.jingle.JingleConnectionManager;
 | 
				
			||||||
import eu.siacs.conversations.xmpp.jingle.OnJinglePacketReceived;
 | 
					import eu.siacs.conversations.xmpp.jingle.OnJinglePacketReceived;
 | 
				
			||||||
import eu.siacs.conversations.xmpp.jingle.stanzas.JinglePacket;
 | 
					import eu.siacs.conversations.xmpp.jingle.stanzas.JinglePacket;
 | 
				
			||||||
 | 
					import eu.siacs.conversations.xmpp.pep.Avatar;
 | 
				
			||||||
import eu.siacs.conversations.xmpp.stanzas.IqPacket;
 | 
					import eu.siacs.conversations.xmpp.stanzas.IqPacket;
 | 
				
			||||||
import eu.siacs.conversations.xmpp.stanzas.MessagePacket;
 | 
					import eu.siacs.conversations.xmpp.stanzas.MessagePacket;
 | 
				
			||||||
import eu.siacs.conversations.xmpp.stanzas.PresencePacket;
 | 
					import eu.siacs.conversations.xmpp.stanzas.PresencePacket;
 | 
				
			||||||
| 
						 | 
					@ -64,6 +65,7 @@ import android.content.Context;
 | 
				
			||||||
import android.content.Intent;
 | 
					import android.content.Intent;
 | 
				
			||||||
import android.content.SharedPreferences;
 | 
					import android.content.SharedPreferences;
 | 
				
			||||||
import android.database.ContentObserver;
 | 
					import android.database.ContentObserver;
 | 
				
			||||||
 | 
					import android.graphics.Bitmap;
 | 
				
			||||||
import android.net.ConnectivityManager;
 | 
					import android.net.ConnectivityManager;
 | 
				
			||||||
import android.net.NetworkInfo;
 | 
					import android.net.NetworkInfo;
 | 
				
			||||||
import android.net.Uri;
 | 
					import android.net.Uri;
 | 
				
			||||||
| 
						 | 
					@ -1183,6 +1185,17 @@ public class XmppConnectionService extends Service {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public void pushAvatar(Account account, Uri image) {
 | 
				
			||||||
 | 
							Avatar avatar = getFileBackend().getPepAvatar(image, 192, Bitmap.CompressFormat.WEBP);
 | 
				
			||||||
 | 
							if (avatar!=null) {
 | 
				
			||||||
 | 
								Log.d(LOGTAG,avatar.sha1sum);
 | 
				
			||||||
 | 
								Log.d(LOGTAG,avatar.image);
 | 
				
			||||||
 | 
								avatar.type = "image/webp";
 | 
				
			||||||
 | 
								getFileBackend().save(avatar);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	public void deleteContactOnServer(Contact contact) {
 | 
						public void deleteContactOnServer(Contact contact) {
 | 
				
			||||||
		contact.resetOption(Contact.Options.PREEMPTIVE_GRANT);
 | 
							contact.resetOption(Contact.Options.PREEMPTIVE_GRANT);
 | 
				
			||||||
		contact.resetOption(Contact.Options.DIRTY_PUSH);
 | 
							contact.resetOption(Contact.Options.DIRTY_PUSH);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -99,6 +99,8 @@ public class ManageAccountActivity extends XmppActivity {
 | 
				
			||||||
				xmppConnectionService
 | 
									xmppConnectionService
 | 
				
			||||||
						.updateAccount(selectedAccountForActionMode);
 | 
											.updateAccount(selectedAccountForActionMode);
 | 
				
			||||||
				mode.finish();
 | 
									mode.finish();
 | 
				
			||||||
 | 
								} else if (item.getItemId() == R.id.mgmt_account_publish_avatar) {
 | 
				
			||||||
 | 
									startActivity(new Intent(getApplicationContext(), PublishProfilePictureActivity.class));
 | 
				
			||||||
			} else if (item.getItemId() == R.id.mgmt_account_delete) {
 | 
								} else if (item.getItemId() == R.id.mgmt_account_delete) {
 | 
				
			||||||
				AlertDialog.Builder builder = new AlertDialog.Builder(activity);
 | 
									AlertDialog.Builder builder = new AlertDialog.Builder(activity);
 | 
				
			||||||
				builder.setTitle(getString(R.string.mgmt_account_are_you_sure));
 | 
									builder.setTitle(getString(R.string.mgmt_account_are_you_sure));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,101 @@
 | 
				
			||||||
 | 
					package eu.siacs.conversations.ui;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import android.content.Intent;
 | 
				
			||||||
 | 
					import android.graphics.Bitmap;
 | 
				
			||||||
 | 
					import android.net.Uri;
 | 
				
			||||||
 | 
					import android.os.Bundle;
 | 
				
			||||||
 | 
					import android.util.Log;
 | 
				
			||||||
 | 
					import android.view.View;
 | 
				
			||||||
 | 
					import android.view.View.OnClickListener;
 | 
				
			||||||
 | 
					import android.widget.Button;
 | 
				
			||||||
 | 
					import android.widget.ImageView;
 | 
				
			||||||
 | 
					import android.widget.TextView;
 | 
				
			||||||
 | 
					import eu.siacs.conversations.R;
 | 
				
			||||||
 | 
					import eu.siacs.conversations.utils.PhoneHelper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class PublishProfilePictureActivity extends XmppActivity {
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private static final int REQUEST_CHOOSE_FILE = 0xac23;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private ImageView avatar;
 | 
				
			||||||
 | 
						private TextView explanation;
 | 
				
			||||||
 | 
						private Button cancelButton;
 | 
				
			||||||
 | 
						private Button publishButton;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private Uri avatarUri;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public void onCreate(Bundle savedInstanceState) {
 | 
				
			||||||
 | 
							super.onCreate(savedInstanceState);
 | 
				
			||||||
 | 
							setContentView(R.layout.activity_publish_profile_picture);
 | 
				
			||||||
 | 
							this.avatar = (ImageView) findViewById(R.id.account_image);
 | 
				
			||||||
 | 
							this.explanation = (TextView) findViewById(R.id.explanation);
 | 
				
			||||||
 | 
							this.cancelButton = (Button) findViewById(R.id.cancel_button);
 | 
				
			||||||
 | 
							this.publishButton = (Button) findViewById(R.id.publish_button);
 | 
				
			||||||
 | 
							this.publishButton.setOnClickListener(new OnClickListener() {
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								@Override
 | 
				
			||||||
 | 
								public void onClick(View v) {
 | 
				
			||||||
 | 
									if (avatarUri!=null) {
 | 
				
			||||||
 | 
										xmppConnectionService.pushAvatar(null, avatarUri);
 | 
				
			||||||
 | 
										finish();
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
							this.cancelButton.setOnClickListener(new OnClickListener() {
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								@Override
 | 
				
			||||||
 | 
								public void onClick(View v) {
 | 
				
			||||||
 | 
									finish();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
							this.avatar.setOnClickListener(new OnClickListener() {
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								@Override
 | 
				
			||||||
 | 
								public void onClick(View v) {
 | 
				
			||||||
 | 
									Intent attachFileIntent = new Intent();
 | 
				
			||||||
 | 
									attachFileIntent.setType("image/*");
 | 
				
			||||||
 | 
									attachFileIntent.setAction(Intent.ACTION_GET_CONTENT);
 | 
				
			||||||
 | 
									Intent chooser = Intent.createChooser(attachFileIntent,
 | 
				
			||||||
 | 
											getString(R.string.attach_file));
 | 
				
			||||||
 | 
									startActivityForResult(chooser, REQUEST_CHOOSE_FILE);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						protected void onActivityResult(int requestCode, int resultCode,
 | 
				
			||||||
 | 
								final Intent data) {
 | 
				
			||||||
 | 
							super.onActivityResult(requestCode, resultCode, data);
 | 
				
			||||||
 | 
							Log.d("xmppService","on activity result");
 | 
				
			||||||
 | 
							if (resultCode == RESULT_OK) {
 | 
				
			||||||
 | 
								if (requestCode == REQUEST_CHOOSE_FILE) {
 | 
				
			||||||
 | 
									Log.d("xmppService","bla");
 | 
				
			||||||
 | 
									this.avatarUri = data.getData();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						protected void onBackendConnected() {
 | 
				
			||||||
 | 
							Log.d("xmppService","on backend connected");
 | 
				
			||||||
 | 
							if (this.avatarUri == null) {
 | 
				
			||||||
 | 
								avatarUri = PhoneHelper.getSefliUri(getApplicationContext());
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							loadImageIntoPreview(avatarUri);
 | 
				
			||||||
 | 
							String explainText = getString(R.string.publish_avatar_explanation,"daniel@gultsch.de");
 | 
				
			||||||
 | 
							this.explanation.setText(explainText);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						protected void loadImageIntoPreview(Uri uri) {
 | 
				
			||||||
 | 
							Bitmap bm = xmppConnectionService.getFileBackend().cropCenterSquare(uri, 384);
 | 
				
			||||||
 | 
							this.avatar.setImageBitmap(bm);
 | 
				
			||||||
 | 
							enablePublishButton();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						protected void enablePublishButton() {
 | 
				
			||||||
 | 
							this.publishButton.setEnabled(true);
 | 
				
			||||||
 | 
							this.publishButton.setTextColor(getPrimaryTextColor());
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -70,7 +70,7 @@ public class PhoneHelper {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public static Uri getSefliUri(Context context) {
 | 
						public static Uri getSefliUri(Context context) {
 | 
				
			||||||
		String[] mProjection = new String[] { Profile._ID,
 | 
							String[] mProjection = new String[] { Profile._ID,
 | 
				
			||||||
				Profile.PHOTO_THUMBNAIL_URI };
 | 
									Profile.PHOTO_URI };
 | 
				
			||||||
		Cursor mProfileCursor = context.getContentResolver().query(
 | 
							Cursor mProfileCursor = context.getContentResolver().query(
 | 
				
			||||||
				Profile.CONTENT_URI, mProjection, null, null, null);
 | 
									Profile.CONTENT_URI, mProjection, null, null, null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,23 @@
 | 
				
			||||||
 | 
					package eu.siacs.conversations.xmpp.pep;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import android.util.Base64;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class Avatar {
 | 
				
			||||||
 | 
						public String type;
 | 
				
			||||||
 | 
						public String sha1sum;
 | 
				
			||||||
 | 
						public String image;
 | 
				
			||||||
 | 
						public byte[] getImageAsBytes() {
 | 
				
			||||||
 | 
							return Base64.decode(image, Base64.DEFAULT);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public String getFilename() {
 | 
				
			||||||
 | 
							if (type==null) {
 | 
				
			||||||
 | 
								return sha1sum;
 | 
				
			||||||
 | 
							} else if (type.equalsIgnoreCase("image/webp")) {
 | 
				
			||||||
 | 
								return sha1sum+".webp";
 | 
				
			||||||
 | 
							} else if (type.equalsIgnoreCase("image/png")) {
 | 
				
			||||||
 | 
								return sha1sum+".png";
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								return sha1sum;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue