diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java index 3b942cdb0..ec7e13f8a 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java @@ -25,6 +25,7 @@ import org.briarproject.bramble.api.plugin.simplex.SimplexPluginFactory; import org.briarproject.bramble.api.reporting.DevConfig; import org.briarproject.bramble.plugin.bluetooth.AndroidBluetoothPluginFactory; import org.briarproject.bramble.plugin.file.AndroidRemovableDrivePluginFactory; +import org.briarproject.bramble.plugin.file.RemovableDriveModule; import org.briarproject.bramble.plugin.tcp.AndroidLanTcpPluginFactory; import org.briarproject.bramble.plugin.tor.AndroidTorPluginFactory; import org.briarproject.bramble.util.AndroidUtils; @@ -92,6 +93,7 @@ import static org.briarproject.briar.android.TestingConstants.IS_DEBUG_BUILD; GroupListModule.class, GroupConversationModule.class, SharingModule.class, + RemovableDriveModule.class }) public class AppModule { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/removabledrive/RemovableDriveModule.java b/briar-android/src/main/java/org/briarproject/briar/android/removabledrive/RemovableDriveModule.java new file mode 100644 index 000000000..44dd6e69a --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/removabledrive/RemovableDriveModule.java @@ -0,0 +1,18 @@ +package org.briarproject.briar.android.removabledrive; + +import org.briarproject.briar.android.viewmodel.ViewModelKey; + +import androidx.lifecycle.ViewModel; +import dagger.Binds; +import dagger.Module; +import dagger.multibindings.IntoMap; + +@Module +public interface RemovableDriveModule { + + @Binds + @IntoMap + @ViewModelKey(RemovableDriveViewModel.class) + ViewModel bindRemovableDriveViewModel(RemovableDriveViewModel removableDriveViewModel); + +} diff --git a/briar-android/src/main/java/org/briarproject/briar/android/removabledrive/RemovableDriveViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/removabledrive/RemovableDriveViewModel.java new file mode 100644 index 000000000..d9be940d6 --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/removabledrive/RemovableDriveViewModel.java @@ -0,0 +1,101 @@ +package org.briarproject.briar.android.removabledrive; + +import android.app.Application; +import android.net.Uri; + +import org.briarproject.bramble.api.Consumer; +import org.briarproject.bramble.api.contact.ContactId; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.plugin.file.RemovableDriveManager; +import org.briarproject.bramble.api.plugin.file.RemovableDriveTask; +import org.briarproject.bramble.api.plugin.file.RemovableDriveTask.State; +import org.briarproject.bramble.api.properties.TransportProperties; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.logging.Logger; + +import javax.annotation.Nullable; +import javax.inject.Inject; + +import androidx.lifecycle.AndroidViewModel; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; + +import static java.util.Locale.US; +import static java.util.logging.Logger.getLogger; +import static org.briarproject.bramble.api.plugin.file.RemovableDriveConstants.PROP_URI; + +@NotNullByDefault +class RemovableDriveViewModel extends AndroidViewModel { + + private static final Logger LOG = + getLogger(RemovableDriveViewModel.class.getName()); + + private final RemovableDriveManager manager; + + private final ConcurrentHashMap, RemovableDriveTask> + observers = new ConcurrentHashMap<>(); + + @Inject + RemovableDriveViewModel(Application app, + RemovableDriveManager removableDriveManager) { + super(app); + + this.manager = removableDriveManager; + } + + String getFileName() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss_SSS", US); + return sdf.format(new Date()); + } + + + LiveData write(ContactId contactId, Uri uri) { + TransportProperties p = new TransportProperties(); + p.put(PROP_URI, uri.toString()); + return observe(manager.startWriterTask(contactId, p)); + } + + LiveData read(ContactId contactId, Uri uri) { + TransportProperties p = new TransportProperties(); + p.put(PROP_URI, uri.toString()); + return observe(manager.startReaderTask(contactId, p)); + } + + @Nullable + LiveData ongoingWrite(ContactId contactId) { + RemovableDriveTask task = manager.getCurrentWriterTask(contactId); + if (task == null) { + return null; + } + return observe(task); + } + + @Nullable + LiveData ongoingRead(ContactId contactId) { + RemovableDriveTask task = manager.getCurrentReaderTask(contactId); + if (task == null) { + return null; + } + return observe(task); + } + + private LiveData observe(RemovableDriveTask task) { + MutableLiveData state = new MutableLiveData<>(); + Consumer observer = state::postValue; + task.addObserver(observer); + observers.put(observer, task); + return state; + } + + @Override + protected void onCleared() { + for (Map.Entry, RemovableDriveTask> entry + : observers.entrySet()) { + entry.getValue().removeObserver(entry.getKey()); + } + } +}