diff --git a/src/android/org/linphone/LinphoneManager.java b/src/android/org/linphone/LinphoneManager.java index 60a9e809a..72e3ead59 100644 --- a/src/android/org/linphone/LinphoneManager.java +++ b/src/android/org/linphone/LinphoneManager.java @@ -111,6 +111,7 @@ import org.linphone.receivers.HookReceiver; import org.linphone.receivers.KeepAliveReceiver; import org.linphone.receivers.NetworkManager; import org.linphone.receivers.OutgoingCallReceiver; +import org.linphone.ui.LinphoneMediaScanner; import java.io.File; import java.io.FileInputStream; @@ -210,6 +211,8 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou Log.e(mUserCertsPath+" can't be created."); } } + + mMediaScanner = new LinphoneMediaScanner(c); } private static final int LINPHONE_VOLUME_STREAM = STREAM_VOICE_CALL; @@ -228,6 +231,7 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou private final String mUserCertsPath; private Timer mTimer; private Map mUnreadChatsPerRoom; + private LinphoneMediaScanner mMediaScanner; private void routeAudioToSpeakerHelper(boolean speakerOn) { Log.w("Routing audio to " + (speakerOn ? "speaker" : "earpiece") + ", disabling bluetooth audio route"); @@ -998,11 +1002,16 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou public static synchronized void destroy() { if (instance == null) return; instance.changeStatusToOffline(); + instance.mMediaScanner.destroy(); sExited = true; instance.destroyCore(); instance = null; } + public LinphoneMediaScanner getMediaScanner() { + return mMediaScanner; + } + private String getString(int key) { return mR.getString(key); } diff --git a/src/android/org/linphone/LinphoneUtils.java b/src/android/org/linphone/LinphoneUtils.java index 69de9c8f3..c172e11f2 100644 --- a/src/android/org/linphone/LinphoneUtils.java +++ b/src/android/org/linphone/LinphoneUtils.java @@ -51,6 +51,8 @@ import org.linphone.core.AccountCreator; import org.linphone.core.Address; import org.linphone.core.Call; import org.linphone.core.Call.State; +import org.linphone.core.ChatMessage; +import org.linphone.core.Content; import org.linphone.core.Core; import org.linphone.core.Factory; import org.linphone.core.Friend; @@ -62,6 +64,7 @@ import org.linphone.core.LoggingServiceListener; import org.linphone.core.ProxyConfig; import org.linphone.mediastream.Log; import org.linphone.mediastream.video.capture.hwconf.Hacks; +import org.linphone.ui.LinphoneMediaScanner; import java.io.File; import java.io.FileOutputStream; @@ -764,6 +767,7 @@ public final class LinphoneUtils { if (!file.isDirectory() || !file.exists()) { Log.w("Directory " + file + " doesn't seem to exists yet, let's create it"); file.mkdirs(); + LinphoneManager.getInstance().getMediaScanner().scanFile(file); } return storageDir; } @@ -776,5 +780,17 @@ public final class LinphoneUtils { } imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } + + public static void scanFile(ChatMessage message) { + String appData = message.getAppdata(); + if (appData == null) { + for (Content c : message.getContents()) { + if (c.isFile()) { + appData = c.getFilePath(); + } + } + } + LinphoneManager.getInstance().getMediaScanner().scanFile(new File(appData)); + } } diff --git a/src/android/org/linphone/chat/ChatEventsAdapter.java b/src/android/org/linphone/chat/ChatEventsAdapter.java index 7b7f2f2d8..155f223fc 100644 --- a/src/android/org/linphone/chat/ChatEventsAdapter.java +++ b/src/android/org/linphone/chat/ChatEventsAdapter.java @@ -33,7 +33,6 @@ import android.media.ExifInterface; import android.media.ThumbnailUtils; import android.net.Uri; import android.os.AsyncTask; -import android.os.Environment; import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.v4.content.FileProvider; @@ -527,6 +526,7 @@ public class ChatEventsAdapter extends SelectableAdapter { } if (appData != null) { + LinphoneUtils.scanFile(message); holder.fileName.setText(LinphoneUtils.getNameFromFilePath(appData)); if (LinphoneUtils.isExtensionImage(appData)) { holder.messageImage.setVisibility(View.VISIBLE); diff --git a/src/android/org/linphone/ui/LinphoneMediaScanner.java b/src/android/org/linphone/ui/LinphoneMediaScanner.java new file mode 100644 index 000000000..bfc5358d9 --- /dev/null +++ b/src/android/org/linphone/ui/LinphoneMediaScanner.java @@ -0,0 +1,57 @@ +package org.linphone.ui; + +import android.content.Context; +import android.media.MediaScannerConnection; +import android.net.Uri; + +import org.linphone.mediastream.Log; + +import java.io.File; + +public class LinphoneMediaScanner implements MediaScannerConnection.MediaScannerConnectionClient { + private MediaScannerConnection mMediaConnection; + private boolean mIsConnected; + private File mFileWaitingForScan; + + public LinphoneMediaScanner(Context context) { + mIsConnected = false; + mMediaConnection = new MediaScannerConnection(context, this); + mMediaConnection.connect(); + mFileWaitingForScan = null; + } + + @Override + public void onMediaScannerConnected() { + mIsConnected = true; + Log.i("[MediaScanner] Connected"); + if (mFileWaitingForScan != null) { + scanFile(mFileWaitingForScan); + mFileWaitingForScan = null; + } + } + + public void scanFile(File file) { + scanFile(file, null); + } + + public void scanFile(File file, String mime) { + if (!mIsConnected) { + Log.w("[MediaScanner] Not connected yet..."); + mFileWaitingForScan = file; + return; + } + Log.i("[MediaScanner] Scanning file " + file.getAbsolutePath() + " with MIME " + mime); + mMediaConnection.scanFile(file.getAbsolutePath(), mime); + } + + @Override + public void onScanCompleted(String path, Uri uri) { + Log.i("[MediaScanner] Scan completed : " + path + " => " + uri); + } + + public void destroy() { + Log.i("[MediaScanner] Disconnecting"); + mMediaConnection.disconnect(); + mIsConnected = false; + } +} \ No newline at end of file