allow images to be opened with gallary app
This commit is contained in:
parent
fc6a16c31b
commit
77da0c6b5d
|
@ -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" />
|
||||||
|
|
|
@ -38,7 +38,15 @@
|
||||||
android:autoLink="web"
|
android:autoLink="web"
|
||||||
android:textIsSelectable="true"
|
android:textIsSelectable="true"
|
||||||
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"
|
||||||
|
|
|
@ -55,7 +55,7 @@
|
||||||
<string name="receiving_image">Receiving image file. Please wait…</string>
|
<string name="receiving_image">Receiving image file. Please wait…</string>
|
||||||
<string name="preparing_image">Preparing image for transmission. Please wait…</string>
|
<string name="preparing_image">Preparing image for transmission. Please wait…</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>
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
97
src/eu/siacs/conversations/services/ImageProvider.java
Normal file
97
src/eu/siacs/conversations/services/ImageProvider.java
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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");
|
||||||
|
|
Loading…
Reference in a new issue