Browse Source

Add live photo playback to Preview Fragment

Signed-off-by: alperozturk <alper_ozturk@proton.me>
alperozturk 1 year ago
parent
commit
df4c5319c8

+ 14 - 5
app/src/main/java/com/owncloud/android/datamodel/OCFile.java

@@ -85,6 +85,7 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa
     private long lastSyncDateForData;
     private boolean previewAvailable;
     private String livePhoto;
+    public OCFile videoOfLivePhoto;
     private String etag;
     private String etagOnServer;
     private boolean sharedViaLink;
@@ -484,15 +485,23 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa
         Log_OC.d(TAG, "OCFile name changing from " + remotePath);
         if (!TextUtils.isEmpty(name) && !name.contains(PATH_SEPARATOR) && !ROOT_PATH.equals(remotePath)) {
             String parent = new File(this.getRemotePath()).getParent();
-            parent = parent.endsWith(PATH_SEPARATOR) ? parent : parent + PATH_SEPARATOR;
-            remotePath = parent + name;
-            if (isFolder()) {
-                remotePath += PATH_SEPARATOR;
+            if (parent != null) {
+                parent = parent.endsWith(PATH_SEPARATOR) ? parent : parent + PATH_SEPARATOR;
+                remotePath = parent + name;
+                if (isFolder()) {
+                    remotePath += PATH_SEPARATOR;
+                }
+                Log_OC.d(TAG, "OCFile name changed to " + remotePath);
             }
-            Log_OC.d(TAG, "OCFile name changed to " + remotePath);
         }
     }
 
+    public void setRemotePathV2(String name) {
+        this.remotePath = name;
+        this.decryptedRemotePath = name;
+        localUri = getStorageUri();
+    }
+
     /**
      * Used internally. Reset all file properties
      */

+ 1 - 1
app/src/main/java/com/owncloud/android/db/ProviderMeta.java

@@ -35,7 +35,7 @@ import java.util.List;
  */
 public class ProviderMeta {
     public static final String DB_NAME = "filelist";
-    public static final int DB_VERSION = 75;
+    public static final int DB_VERSION = 74;
 
     private ProviderMeta() {
         // No instance

+ 1 - 0
app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java

@@ -123,6 +123,7 @@ public abstract class FileActivity extends DrawerActivity
         LoadingVersionNumberTask.VersionDevInterface, FileDetailSharingFragment.OnEditShareListener {
 
     public static final String EXTRA_FILE = "com.owncloud.android.ui.activity.FILE";
+    public static final String EXTRA_LIVE_PHOTO_FILE = "com.owncloud.android.ui.activity.LIVE.PHOTO.FILE";
     public static final String EXTRA_USER = "com.owncloud.android.ui.activity.USER";
     public static final String EXTRA_FROM_NOTIFICATION = "com.owncloud.android.ui.activity.FROM_NOTIFICATION";
     public static final String APP_OPENED_COUNT = "APP_OPENED_COUNT";

+ 2 - 0
app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@ -2096,6 +2096,7 @@ public class FileDisplayActivity extends FileActivity
     public void startImagePreview(OCFile file, boolean showPreview) {
         Intent showDetailsIntent = new Intent(this, PreviewImageActivity.class);
         showDetailsIntent.putExtra(EXTRA_FILE, file);
+        showDetailsIntent.putExtra(EXTRA_LIVE_PHOTO_FILE, file.videoOfLivePhoto);
         showDetailsIntent.putExtra(EXTRA_USER, getUser().orElseThrow(RuntimeException::new));
         if (showPreview) {
             startActivity(showDetailsIntent);
@@ -2115,6 +2116,7 @@ public class FileDisplayActivity extends FileActivity
     public void startImagePreview(OCFile file, VirtualFolderType type, boolean showPreview) {
         Intent showDetailsIntent = new Intent(this, PreviewImageActivity.class);
         showDetailsIntent.putExtra(PreviewImageActivity.EXTRA_FILE, file);
+
         showDetailsIntent.putExtra(EXTRA_USER, getUser().orElseThrow(RuntimeException::new));
         showDetailsIntent.putExtra(PreviewImageActivity.EXTRA_VIRTUAL_TYPE, type);
 

+ 63 - 0
app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java

@@ -76,6 +76,7 @@ import com.owncloud.android.ui.preview.PreviewTextFragment;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.FileSortOrder;
 import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.MimeType;
 import com.owncloud.android.utils.MimeTypeUtil;
 import com.owncloud.android.utils.theme.CapabilityUtils;
 import com.owncloud.android.utils.theme.ViewThemeUtils;
@@ -86,8 +87,10 @@ import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 
@@ -398,6 +401,66 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
         // 594c962d71b
         // Not needed for Grid mode unfortunately ListGridImageViewHolder interface used for List and Grid mode
         holder.getLivePhotoIndicatorSeparator().setVisibility(isLivePhoto ? (View.VISIBLE) : (View.GONE));
+        addVideoOCFileOfLivePhoto();
+    }
+
+    public static String extractFileName(String fileName) {
+        int dotIndex = fileName.lastIndexOf(".");
+        if (dotIndex > 0) {
+            return fileName.substring(0, dotIndex);
+        } else {
+            return fileName;
+        }
+    }
+
+    public void addVideoOCFileOfLivePhoto() {
+        for (int i = 0; i < mFiles.size(); i++) {
+            for (int j = i + 1; j < mFiles.size(); j++) {
+                OCFile file = mFiles.get(i);
+                OCFile nextFile = mFiles.get(j);
+
+                String fileLivePhoto = file.getLivePhoto();
+                String nextFileLivePhoto = nextFile.getLivePhoto();
+
+                if (fileLivePhoto != null && nextFileLivePhoto != null) {
+                    String fileLivePhotoName = extractFileName(fileLivePhoto);
+                    String nextFileLivePhotoName = extractFileName(nextFileLivePhoto);
+
+                    if (fileLivePhotoName.equals(nextFileLivePhotoName)) {
+                        if (MimeTypeUtil.isVideo(file.getMimeType())) {
+                            nextFile.videoOfLivePhoto = file;
+                        } else if (MimeTypeUtil.isVideo(nextFile.getMimeType())) {
+                            file.videoOfLivePhoto = nextFile;
+                        }
+                    }
+                }
+            }
+        }
+
+        /*
+
+
+
+
+        Map<String, OCFile> livePhotoToVideoMap = new HashMap<>();
+
+        for (OCFile file : mFiles) {
+            if (MimeTypeUtil.isVideo(file.getMimeType())) {
+                String livePhotoKey = file.getLivePhoto();
+                if (livePhotoToVideoMap.containsKey(livePhotoKey)) {
+                    OCFile previousVideo = livePhotoToVideoMap.get(livePhotoKey);
+
+                    if (previousVideo != null) {
+                        previousVideo.videoOfLivePhoto = file;
+                        file.videoOfLivePhoto = previousVideo;
+                    }
+                } else {
+                    livePhotoToVideoMap.put(livePhotoKey, file);
+                }
+            }
+        }
+         */
+
     }
 
     private void bindListItemViewHolder(ListItemViewHolder holder, OCFile file) {

+ 5 - 1
app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.java

@@ -87,6 +87,8 @@ public class PreviewImageActivity extends FileActivity implements
     private static final String KEY_WAITING_FOR_BINDER = "WAITING_FOR_BINDER";
     private static final String KEY_SYSTEM_VISIBLE = "TRUE";
 
+
+    private OCFile livePhotoFile;
     private ViewPager mViewPager;
     private PreviewImagePagerAdapter mPreviewImagePagerAdapter;
     private int mSavedPosition;
@@ -118,6 +120,8 @@ public class PreviewImageActivity extends FileActivity implements
 
         setContentView(R.layout.preview_image_activity);
 
+        livePhotoFile = getIntent().getParcelableExtra(EXTRA_LIVE_PHOTO_FILE);
+
         // Navigation Drawer
         setupDrawer();
 
@@ -138,7 +142,6 @@ public class PreviewImageActivity extends FileActivity implements
         } else {
             mRequestWaitingForBinder = false;
         }
-
     }
 
     private void initViewPager(User user) {
@@ -162,6 +165,7 @@ public class PreviewImageActivity extends FileActivity implements
 
             mPreviewImagePagerAdapter = new PreviewImagePagerAdapter(
                 getSupportFragmentManager(),
+                livePhotoFile,
                 parentFolder,
                 user,
                 getStorageManager(),

+ 12 - 7
app/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java

@@ -60,6 +60,7 @@ import com.owncloud.android.databinding.PreviewImageFragmentBinding;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.datamodel.ThumbnailsCacheManager;
 import com.owncloud.android.lib.common.utils.Log_OC;
+import com.owncloud.android.ui.activity.FileDisplayActivity;
 import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
 import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment;
 import com.owncloud.android.ui.fragment.FileFragment;
@@ -120,7 +121,6 @@ public class PreviewImageFragment extends FileFragment implements Injectable {
     private static final String TAG = PreviewImageFragment.class.getSimpleName();
 
     private boolean ignoreFirstSavedState;
-
     private LoadBitmapTask loadBitmapTask;
 
     @Inject ConnectivityService connectivityService;
@@ -148,6 +148,7 @@ public class PreviewImageFragment extends FileFragment implements Injectable {
         PreviewImageFragment frag = new PreviewImageFragment();
         frag.showResizedImage = showResizedImage;
         Bundle args = new Bundle();
+        // TODO passed videoOfLivePhoto is null
         args.putParcelable(ARG_FILE, imageFile);
         args.putBoolean(ARG_IGNORE_FIRST, ignoreFirstSavedState);
         args.putBoolean(ARG_SHOW_RESIZED_IMAGE, showResizedImage);
@@ -197,21 +198,25 @@ public class PreviewImageFragment extends FileFragment implements Injectable {
         view.setOnClickListener(v -> togglePreviewImageFullScreen());
 
         binding.image.setOnClickListener(v -> togglePreviewImageFullScreen());
+        checkLivePhotoAvailability();
+        setMultiListLoadingMessage();
+
+        return view;
+    }
 
-        if (getFile().getLivePhoto() != null) {
+    private void checkLivePhotoAvailability() {
+        String livePhoto = getFile().getLivePhoto();
+
+        if (livePhoto != null) {
             binding.image.setOnLongClickListener(v -> {
                 playLivePhoto();
                 return true;
             });
         }
-
-        setMultiListLoadingMessage();
-
-        return view;
     }
 
     private void playLivePhoto() {
-        Fragment mediaFragment = PreviewMediaFragment.newInstance(getFile(), accountManager.getUser(), 0, true);
+        Fragment mediaFragment = PreviewMediaFragment.newInstance(getFile().videoOfLivePhoto, accountManager.getUser(), 0, true);
         FragmentManager fragmentManager = requireActivity().getSupportFragmentManager();
         FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
         fragmentTransaction.replace(R.id.top, mediaFragment);

+ 9 - 1
app/src/main/java/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.java

@@ -47,6 +47,7 @@ import androidx.fragment.app.FragmentStatePagerAdapter;
  */
 public class PreviewImagePagerAdapter extends FragmentStatePagerAdapter {
 
+    private OCFile selectedFile;
     private List<OCFile> mImageFiles;
     private User user;
     private Set<Object> mObsoleteFragments;
@@ -64,6 +65,7 @@ public class PreviewImagePagerAdapter extends FragmentStatePagerAdapter {
      * @param storageManager    Bridge to database.
      */
     public PreviewImagePagerAdapter(FragmentManager fragmentManager,
+                                    OCFile selectedFile,
                                     OCFile parentFolder,
                                     User user,
                                     FileDataStorageManager storageManager,
@@ -78,6 +80,7 @@ public class PreviewImagePagerAdapter extends FragmentStatePagerAdapter {
         }
 
         this.user = user;
+        this.selectedFile = selectedFile;
         mStorageManager = storageManager;
         mImageFiles = mStorageManager.getFolderImages(parentFolder, onlyOnDevice);
 
@@ -147,18 +150,23 @@ public class PreviewImagePagerAdapter extends FragmentStatePagerAdapter {
         }
     }
 
+    private void addVideoOfLivePhoto(OCFile file) {
+        file.videoOfLivePhoto = selectedFile;
+    }
 
     @NonNull
     public Fragment getItem(int i) {
+        // TODO passed videoOfLivePhoto is null
         OCFile file = getFileAt(i);
         Fragment fragment;
 
         if (file == null) {
             fragment = PreviewImageErrorFragment.newInstance();
-
         } else if (file.isDown()) {
             fragment = PreviewImageFragment.newInstance(file, mObsoletePositions.contains(i), false);
         } else {
+            addVideoOfLivePhoto(file);
+
             if (mDownloadErrors.remove(i)) {
                 fragment = FileDownloadFragment.newInstance(file, user, true);
                 ((FileDownloadFragment) fragment).setError(true);