allow images to be opened with gallary app

This commit is contained in:
Daniel Gultsch 2014-04-21 19:51:03 +02:00
parent fc6a16c31b
commit 77da0c6b5d
7 changed files with 161 additions and 5 deletions

View file

@ -23,6 +23,11 @@
android:theme="@android:style/Theme.Holo.Light" > android:theme="@android:style/Theme.Holo.Light" >
<service android:name="eu.siacs.conversations.services.XmppConnectionService" /> <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" > <receiver android:name="eu.siacs.conversations.services.EventReceiver" >
<intent-filter> <intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.BOOT_COMPLETED" />

View file

@ -40,6 +40,14 @@
android:textColor="#333333" 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 <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View file

@ -55,7 +55,7 @@
<string name="receiving_image">Receiving image file. Please wait&#8230;</string> <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="preparing_image">Preparing image for transmission. Please wait&#8230;</string>
<string name="action_clear_history">Clear history</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="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="delete_messages">Delete messages</string>
<string name="also_end_conversation">End this conversations afterwards</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_otr_message">Send OTR encrypted message</string>
<string name="send_pgp_message">Send openPGP 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="your_nick_has_been_changed">Your nickname has been changed</string>
<string name="download_image">Download Image</string>
</resources> </resources>

View file

@ -305,11 +305,43 @@ public class DatabaseBackend extends SQLiteOpenHelper {
SQLiteDatabase db = this.getWritableDatabase(); SQLiteDatabase db = this.getWritableDatabase();
String[] args = { uuid }; String[] args = { uuid };
Cursor cursor = db.query(Contact.TABLENAME, null, Contact.UUID + "=?", args, null, null, null); Cursor cursor = db.query(Contact.TABLENAME, null, Contact.UUID + "=?", args, null, null, null);
if (cursor.getCount() == 0) if (cursor.getCount() == 0) {
return null; return null;
}
cursor.moveToFirst(); cursor.moveToFirst();
return Contact.fromCursor(cursor); 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);
}
} }

View file

@ -14,8 +14,10 @@ import android.net.Uri;
import android.util.Log; import android.util.Log;
import android.util.LruCache; import android.util.LruCache;
import eu.siacs.conversations.entities.Account;
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.services.XmppConnectionService;
import eu.siacs.conversations.xmpp.jingle.JingleFile; import eu.siacs.conversations.xmpp.jingle.JingleFile;
public class FileBackend { public class FileBackend {
@ -27,7 +29,6 @@ public class FileBackend {
public FileBackend(Context context) { public FileBackend(Context context) {
this.context = context; this.context = context;
int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
int cacheSize = maxMemory / 8; int cacheSize = maxMemory / 8;
thumbnailCache = new LruCache<String, Bitmap>(cacheSize) { thumbnailCache = new LruCache<String, Bitmap>(cacheSize) {

View file

@ -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;
}
}

View file

@ -31,6 +31,7 @@ import android.content.SharedPreferences;
import android.content.IntentSender.SendIntentException; import android.content.IntentSender.SendIntentException;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.net.Uri;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Bundle; import android.os.Bundle;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
@ -197,7 +198,7 @@ public class ConversationFragment extends Fragment {
@Override @Override
public View getView(int position, View view, ViewGroup parent) { public View getView(int position, View view, ViewGroup parent) {
Message item = getItem(position); final Message item = getItem(position);
int type = getItemViewType(position); int type = getItemViewType(position);
ViewHolder viewHolder; ViewHolder viewHolder;
if (view == null) { if (view == null) {
@ -283,6 +284,17 @@ public class ConversationFragment extends Fragment {
viewHolder.image.setImageBitmap(thumbnail); viewHolder.image.setImageBitmap(thumbnail);
viewHolder.messageBody.setVisibility(View.GONE); viewHolder.messageBody.setVisibility(View.GONE);
viewHolder.image.setVisibility(View.VISIBLE); 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) { } catch (FileNotFoundException e) {
viewHolder.image.setVisibility(View.GONE); viewHolder.image.setVisibility(View.GONE);
viewHolder.messageBody.setText("error loading image file"); viewHolder.messageBody.setText("error loading image file");