aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Gultsch <daniel.gultsch@rwth-aachen.de>2014-04-21 19:51:03 +0200
committerDaniel Gultsch <daniel.gultsch@rwth-aachen.de>2014-04-21 19:51:03 +0200
commit77da0c6b5d3d6925c8018c1eb57fb26d102a937d (patch)
treeef392c79f3ad3df6de361ded98ab9d377965a371
parentfc6a16c31b56a1249fb28b4f90018bca4207dab7 (diff)
allow images to be opened with gallary app
-rw-r--r--AndroidManifest.xml5
-rw-r--r--res/layout/message_recieved.xml10
-rw-r--r--res/values/strings.xml3
-rw-r--r--src/eu/siacs/conversations/persistance/DatabaseBackend.java34
-rw-r--r--src/eu/siacs/conversations/persistance/FileBackend.java3
-rw-r--r--src/eu/siacs/conversations/services/ImageProvider.java97
-rw-r--r--src/eu/siacs/conversations/ui/ConversationFragment.java14
7 files changed, 161 insertions, 5 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index ed81167a..c7f564bc 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -23,6 +23,11 @@
android:theme="@android:style/Theme.Holo.Light" >
<service android:name="eu.siacs.conversations.services.XmppConnectionService" />
+ <provider
+ android:name="eu.siacs.conversations.services.ImageProvider"
+ android:authorities="eu.siacs.conversations.images"
+ android:exported="true"/>
+
<receiver android:name="eu.siacs.conversations.services.EventReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
diff --git a/res/layout/message_recieved.xml b/res/layout/message_recieved.xml
index f4f34232..9893ef23 100644
--- a/res/layout/message_recieved.xml
+++ b/res/layout/message_recieved.xml
@@ -38,7 +38,15 @@
android:autoLink="web"
android:textIsSelectable="true"
android:textColor="#333333"
- android:textSize="16sp" />
+ android:textSize="16sp"/>
+
+ <Button
+ android:id="@+id/download_button"
+ style="?android:attr/buttonStyleSmall"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/download_image"
+ android:visibility="gone"/>
<LinearLayout
android:layout_width="wrap_content"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 738332c2..df096179 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -55,7 +55,7 @@
<string name="receiving_image">Receiving image file. Please wait&#8230;</string>
<string name="preparing_image">Preparing image for transmission. Please wait&#8230;</string>
<string name="action_clear_history">Clear history</string>
- <string name="clear_conversation_history">Clear Conversation history</string>
+ <string name="clear_conversation_history">Clear Conversation History</string>
<string name="clear_histor_msg">Do you want to delete all messages within this Conversation?\n\n<b>Warning:</b> This will not influence messages stored on other devices or servers.</string>
<string name="delete_messages">Delete messages</string>
<string name="also_end_conversation">End this conversations afterwards</string>
@@ -65,4 +65,5 @@
<string name="send_otr_message">Send OTR encrypted message</string>
<string name="send_pgp_message">Send openPGP encrypted message</string>
<string name="your_nick_has_been_changed">Your nickname has been changed</string>
+ <string name="download_image">Download Image</string>
</resources>
diff --git a/src/eu/siacs/conversations/persistance/DatabaseBackend.java b/src/eu/siacs/conversations/persistance/DatabaseBackend.java
index c8c974de..5a34dac6 100644
--- a/src/eu/siacs/conversations/persistance/DatabaseBackend.java
+++ b/src/eu/siacs/conversations/persistance/DatabaseBackend.java
@@ -305,11 +305,43 @@ public class DatabaseBackend extends SQLiteOpenHelper {
SQLiteDatabase db = this.getWritableDatabase();
String[] args = { uuid };
Cursor cursor = db.query(Contact.TABLENAME, null, Contact.UUID + "=?", args, null, null, null);
- if (cursor.getCount() == 0)
+ if (cursor.getCount() == 0) {
return null;
+ }
cursor.moveToFirst();
return Contact.fromCursor(cursor);
}
+ public Conversation findConversationByUuid(String conversationUuid) {
+ SQLiteDatabase db = this.getReadableDatabase();
+ String[] selectionArgs = { conversationUuid };
+ Cursor cursor = db.query(Conversation.TABLENAME, null, Conversation.UUID + "=?", selectionArgs, null, null, null);
+ if (cursor.getCount() == 0) {
+ return null;
+ }
+ cursor.moveToFirst();
+ return Conversation.fromCursor(cursor);
+ }
+
+ public Message findMessageByUuid(String messageUuid) {
+ SQLiteDatabase db = this.getReadableDatabase();
+ String[] selectionArgs = { messageUuid };
+ Cursor cursor = db.query(Message.TABLENAME, null, Message.UUID + "=?", selectionArgs, null, null, null);
+ if (cursor.getCount() == 0) {
+ return null;
+ }
+ cursor.moveToFirst();
+ return Message.fromCursor(cursor);
+ }
+ public Account findAccountByUuid(String accountUuid) {
+ SQLiteDatabase db = this.getReadableDatabase();
+ String[] selectionArgs = { accountUuid };
+ Cursor cursor = db.query(Account.TABLENAME, null, Account.UUID + "=?", selectionArgs, null, null, null);
+ if (cursor.getCount() == 0) {
+ return null;
+ }
+ cursor.moveToFirst();
+ return Account.fromCursor(cursor);
+ }
}
diff --git a/src/eu/siacs/conversations/persistance/FileBackend.java b/src/eu/siacs/conversations/persistance/FileBackend.java
index 307a9e2c..d830652d 100644
--- a/src/eu/siacs/conversations/persistance/FileBackend.java
+++ b/src/eu/siacs/conversations/persistance/FileBackend.java
@@ -14,8 +14,10 @@ import android.net.Uri;
import android.util.Log;
import android.util.LruCache;
+import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.entities.Message;
+import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.xmpp.jingle.JingleFile;
public class FileBackend {
@@ -27,7 +29,6 @@ public class FileBackend {
public FileBackend(Context context) {
this.context = context;
-
int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
int cacheSize = maxMemory / 8;
thumbnailCache = new LruCache<String, Bitmap>(cacheSize) {
diff --git a/src/eu/siacs/conversations/services/ImageProvider.java b/src/eu/siacs/conversations/services/ImageProvider.java
new file mode 100644
index 00000000..c1bae661
--- /dev/null
+++ b/src/eu/siacs/conversations/services/ImageProvider.java
@@ -0,0 +1,97 @@
+package eu.siacs.conversations.services;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+
+import eu.siacs.conversations.entities.Account;
+import eu.siacs.conversations.entities.Conversation;
+import eu.siacs.conversations.entities.Message;
+import eu.siacs.conversations.persistance.DatabaseBackend;
+import eu.siacs.conversations.persistance.FileBackend;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.ParcelFileDescriptor;
+import android.util.Log;
+
+public class ImageProvider extends ContentProvider {
+
+ @Override
+ public ParcelFileDescriptor openFile(Uri uri, String mode)
+ throws FileNotFoundException {
+ DatabaseBackend databaseBackend = DatabaseBackend
+ .getInstance(getContext());
+ FileBackend fileBackend = new FileBackend(getContext());
+ String uuids = uri.getPath();
+ Log.d("xmppService", "uuids = " + uuids);
+ if (uuids == null) {
+ throw new FileNotFoundException();
+ }
+ String[] uuidsSplited = uuids.split("/");
+ if (uuidsSplited.length != 3) {
+ throw new FileNotFoundException();
+ }
+ String conversationUuid = uuidsSplited[1];
+ String messageUuid = uuidsSplited[2];
+
+ Conversation conversation = databaseBackend
+ .findConversationByUuid(conversationUuid);
+ if (conversation == null) {
+ throw new FileNotFoundException("conversation " + conversationUuid
+ + " could not be found");
+ }
+ Message message = databaseBackend.findMessageByUuid(messageUuid);
+ if (message == null) {
+ throw new FileNotFoundException("message " + messageUuid
+ + " could not be found");
+ }
+
+ Account account = databaseBackend.findAccountByUuid(conversation
+ .getAccountUuid());
+ if (account == null) {
+ throw new FileNotFoundException("account "
+ + conversation.getAccountUuid() + " cound not be found");
+ }
+ message.setConversation(conversation);
+ conversation.setAccount(account);
+
+ File file = fileBackend.getJingleFile(message);
+ ParcelFileDescriptor pfd = ParcelFileDescriptor.open(file,
+ ParcelFileDescriptor.MODE_READ_ONLY);
+ return pfd;
+ }
+
+ @Override
+ public int delete(Uri arg0, String arg1, String[] arg2) {
+ return 0;
+ }
+
+ @Override
+ public String getType(Uri arg0) {
+ return null;
+ }
+
+ @Override
+ public Uri insert(Uri arg0, ContentValues arg1) {
+ return null;
+ }
+
+ @Override
+ public boolean onCreate() {
+ return false;
+ }
+
+ @Override
+ public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,
+ String arg4) {
+ return null;
+ }
+
+ @Override
+ public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
+ return 0;
+ }
+
+}
diff --git a/src/eu/siacs/conversations/ui/ConversationFragment.java b/src/eu/siacs/conversations/ui/ConversationFragment.java
index 6e1db2bf..0604f1db 100644
--- a/src/eu/siacs/conversations/ui/ConversationFragment.java
+++ b/src/eu/siacs/conversations/ui/ConversationFragment.java
@@ -31,6 +31,7 @@ import android.content.SharedPreferences;
import android.content.IntentSender.SendIntentException;
import android.graphics.Bitmap;
import android.graphics.Typeface;
+import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
@@ -197,7 +198,7 @@ public class ConversationFragment extends Fragment {
@Override
public View getView(int position, View view, ViewGroup parent) {
- Message item = getItem(position);
+ final Message item = getItem(position);
int type = getItemViewType(position);
ViewHolder viewHolder;
if (view == null) {
@@ -283,6 +284,17 @@ public class ConversationFragment extends Fragment {
viewHolder.image.setImageBitmap(thumbnail);
viewHolder.messageBody.setVisibility(View.GONE);
viewHolder.image.setVisibility(View.VISIBLE);
+ viewHolder.image.setOnClickListener(new OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+ Uri uri = Uri.parse("content://eu.siacs.conversations.images/"+item.getConversationUuid()+"/"+item.getUuid());
+ Log.d("xmppService","staring intent with uri:"+uri.toString());
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setDataAndType(uri, "image/*");
+ startActivity(intent);
+ }
+ });
} catch (FileNotFoundException e) {
viewHolder.image.setVisibility(View.GONE);
viewHolder.messageBody.setText("error loading image file");