diff --git a/app/src/main/java/com/simplemobiletools/gallery/Utils.kt b/app/src/main/java/com/simplemobiletools/gallery/Utils.kt index 7a9905428..fded3b79f 100644 --- a/app/src/main/java/com/simplemobiletools/gallery/Utils.kt +++ b/app/src/main/java/com/simplemobiletools/gallery/Utils.kt @@ -20,9 +20,7 @@ import java.util.* class Utils { companion object { - fun getFilename(path: String): String { - return path.substring(path.lastIndexOf("/") + 1) - } + fun getFilename(path: String) = path.substring(path.lastIndexOf("/") + 1) fun showToast(context: Context, resId: Int) { context.toast(resId) @@ -94,12 +92,10 @@ class Utils { val uri = Uri.fromFile(file) intent.action = Intent.ACTION_SEND intent.putExtra(Intent.EXTRA_STREAM, uri) - intent.type = getMimeType(medium) + intent.type = medium.getMimeType() activity.startActivity(Intent.createChooser(intent, shareTitle)) } - fun getMimeType(medium: Medium) = if (medium.isVideo) "video/*" else "image/*" - fun showSystemUI(actionbar: ActionBar?, window: Window) { actionbar?.show() diff --git a/app/src/main/java/com/simplemobiletools/gallery/activities/ViewPagerActivity.java b/app/src/main/java/com/simplemobiletools/gallery/activities/ViewPagerActivity.java deleted file mode 100644 index 3d637ed42..000000000 --- a/app/src/main/java/com/simplemobiletools/gallery/activities/ViewPagerActivity.java +++ /dev/null @@ -1,525 +0,0 @@ -package com.simplemobiletools.gallery.activities; - -import android.content.Intent; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.database.Cursor; -import android.media.MediaScannerConnection; -import android.net.Uri; -import android.os.Bundle; -import android.provider.MediaStore; -import android.support.v4.provider.DocumentFile; -import android.support.v4.view.ViewPager; -import android.support.v7.app.ActionBar; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.View; -import android.widget.RelativeLayout; - -import com.simplemobiletools.filepicker.asynctasks.CopyMoveTask; -import com.simplemobiletools.fileproperties.dialogs.PropertiesDialog; -import com.simplemobiletools.gallery.Constants; -import com.simplemobiletools.gallery.MyViewPager; -import com.simplemobiletools.gallery.R; -import com.simplemobiletools.gallery.Utils; -import com.simplemobiletools.gallery.adapters.MyPagerAdapter; -import com.simplemobiletools.gallery.dialogs.CopyDialog; -import com.simplemobiletools.gallery.dialogs.RenameFileDialog; -import com.simplemobiletools.gallery.fragments.ViewPagerFragment; -import com.simplemobiletools.gallery.models.Medium; - -import org.jetbrains.annotations.NotNull; - -import java.io.File; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.regex.Pattern; - -import butterknife.BindView; -import butterknife.ButterKnife; -import butterknife.OnClick; - -public class ViewPagerActivity extends SimpleActivity - implements ViewPager.OnPageChangeListener, View.OnSystemUiVisibilityChangeListener, ViewPager.OnTouchListener, - ViewPagerFragment.FragmentClickListener { - @BindView(R.id.undo_delete) View mUndoBtn; - @BindView(R.id.view_pager) MyViewPager mPager; - - private static final int EDIT_IMAGE = 1; - private static final int SET_WALLPAPER = 2; - private static ActionBar mActionbar; - private static List mMedia; - private static String mPath; - private static String mDirectory; - private static String mToBeDeleted; - private static String mBeingDeleted; - - private static boolean mIsFullScreen; - private static boolean mIsUndoShown; - private static int mPos; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_medium); - ButterKnife.bind(this); - - if (!Utils.Companion.hasStoragePermission(getApplicationContext())) { - finish(); - return; - } - - final Uri uri = getIntent().getData(); - if (uri != null) { - Cursor cursor = null; - try { - final String[] proj = {MediaStore.Images.Media.DATA}; - cursor = getContentResolver().query(uri, proj, null, null, null); - if (cursor != null) { - final int dataIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); - cursor.moveToFirst(); - mPath = cursor.getString(dataIndex); - } - } finally { - if (cursor != null) { - cursor.close(); - } - } - } else { - mPath = getIntent().getStringExtra(Constants.MEDIUM); - } - - if (mPath == null || mPath.isEmpty()) { - Utils.Companion.showToast(getApplicationContext(), R.string.unknown_error); - finish(); - return; - } - - mPos = 0; - mIsFullScreen = true; - mActionbar = getSupportActionBar(); - mToBeDeleted = ""; - mBeingDeleted = ""; - hideSystemUI(); - - Utils.Companion.scanPath(getApplicationContext(), mPath); - addUndoMargin(); - mDirectory = new File(mPath).getParent(); - mMedia = getMedia(); - if (isDirEmpty()) - return; - - final MyPagerAdapter adapter = new MyPagerAdapter(this, getSupportFragmentManager(), mMedia); - mPager.setAdapter(adapter); - mPager.setCurrentItem(mPos); - mPager.addOnPageChangeListener(this); - mPager.setOnTouchListener(this); - - getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(this); - updateActionbarTitle(); - } - - @Override - protected void onResume() { - super.onResume(); - if (!Utils.Companion.hasStoragePermission(getApplicationContext())) { - finish(); - } - } - - @OnClick(R.id.undo_delete) - public void undoDeletion() { - mIsUndoShown = false; - mToBeDeleted = ""; - mBeingDeleted = ""; - mUndoBtn.setVisibility(View.GONE); - reloadViewPager(); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.viewpager_menu, menu); - menu.findItem(R.id.menu_set_as_wallpaper).setVisible(getCurrentMedium().isImage()); - menu.findItem(R.id.menu_edit).setVisible(getCurrentMedium().isImage()); - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - deleteFile(); - switch (item.getItemId()) { - case R.id.menu_set_as_wallpaper: - setAsWallpaper(); - return true; - case R.id.menu_copy_move: - displayCopyDialog(); - return true; - case R.id.menu_open_with: - openWith(); - return true; - case R.id.menu_share: - shareMedium(); - return true; - case R.id.menu_delete: - notifyDeletion(); - return true; - case R.id.menu_rename: - editMedium(); - return true; - case R.id.menu_edit: - openEditor(); - return true; - case R.id.menu_properties: - showProperties(); - return true; - default: - return super.onOptionsItemSelected(item); - } - } - - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - final MyPagerAdapter adapter = (MyPagerAdapter) mPager.getAdapter(); - adapter.updateItems(mPos); - } - - private void displayCopyDialog() { - final File file = getCurrentFile(); - final ArrayList files = new ArrayList<>(); - files.add(file); - new CopyDialog(this, files, new CopyMoveTask.CopyMoveListener() { - @Override - public void copySucceeded(boolean deleted, boolean copiedAll) { - int msgId; - if (deleted) { - reloadViewPager(); - msgId = copiedAll ? R.string.moving_success : R.string.moving_success_partial; - } else { - msgId = copiedAll? R.string.copying_success : R.string.copying_success_partial; - } - Utils.Companion.showToast(getApplicationContext(), msgId); - } - - @Override - public void copyFailed() { - Utils.Companion.showToast(getApplicationContext(), R.string.copy_move_failed); - } - }); - } - - private void openEditor() { - final Intent intent = new Intent(Intent.ACTION_EDIT); - intent.setDataAndType(Uri.fromFile(getCurrentFile()), "image/*"); - final Intent chooser = Intent.createChooser(intent, getString(R.string.edit_image_with)); - - if (intent.resolveActivity(getPackageManager()) != null) { - startActivityForResult(chooser, EDIT_IMAGE); - } else { - Utils.Companion.showToast(getApplicationContext(), R.string.no_editor_found); - } - } - - private void setAsWallpaper() { - final Intent intent = new Intent(Intent.ACTION_ATTACH_DATA); - intent.setDataAndType(Uri.fromFile(getCurrentFile()), "image/jpeg"); - final Intent chooser = Intent.createChooser(intent, getString(R.string.set_as_wallpaper_with)); - - if (intent.resolveActivity(getPackageManager()) != null) { - startActivityForResult(chooser, SET_WALLPAPER); - } else { - Utils.Companion.showToast(getApplicationContext(), R.string.no_wallpaper_setter_found); - } - } - - private void openWith() { - final Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setDataAndType(Uri.fromFile(getCurrentFile()), Utils.Companion.getMimeType(getCurrentMedium())); - final Intent chooser = Intent.createChooser(intent, getString(R.string.open_with)); - - if (intent.resolveActivity(getPackageManager()) != null) { - startActivity(chooser); - } else { - Utils.Companion.showToast(getApplicationContext(), R.string.no_app_found); - } - } - - private void showProperties() { - new PropertiesDialog(this, getCurrentFile().getAbsolutePath(), false); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == EDIT_IMAGE) { - if (resultCode == RESULT_OK && data != null) { - final MyPagerAdapter adapter = (MyPagerAdapter) mPager.getAdapter(); - adapter.updateItems(mPos); - } - } else if (requestCode == SET_WALLPAPER) { - if (resultCode == RESULT_OK) { - Utils.Companion.showToast(getApplicationContext(), R.string.wallpaper_set_successfully); - } - } - super.onActivityResult(requestCode, resultCode, data); - } - - private void shareMedium() { - final Medium medium = getCurrentMedium(); - Utils.Companion.shareMedium(medium, this); - } - - private void notifyDeletion() { - if (isShowingPermDialog(new File(mPath))) - return; - - mToBeDeleted = getCurrentFile().getAbsolutePath(); - if (mMedia.size() <= 1) { - deleteFile(); - } else { - Utils.Companion.showToast(this, R.string.file_deleted); - mUndoBtn.setVisibility(View.VISIBLE); - mIsUndoShown = true; - reloadViewPager(); - } - } - - private void deleteFile() { - if (mToBeDeleted.isEmpty()) - return; - - mIsUndoShown = false; - mBeingDeleted = ""; - boolean mWasFileDeleted = false; - - final File file = new File(mToBeDeleted); - if (Utils.Companion.needsStupidWritePermissions(this, mToBeDeleted)) { - if (!isShowingPermDialog(file)) { - final DocumentFile document = Utils.Companion.getFileDocument(this, mToBeDeleted, mConfig.getTreeUri()); - if (document.canWrite()) { - mWasFileDeleted = document.delete(); - } - } - } else { - mWasFileDeleted = file.delete(); - } - - if (mWasFileDeleted) { - mBeingDeleted = mToBeDeleted; - final String[] deletedPath = new String[]{mToBeDeleted}; - MediaScannerConnection.scanFile(getApplicationContext(), deletedPath, null, new MediaScannerConnection.OnScanCompletedListener() { - @Override - public void onScanCompleted(String path, Uri uri) { - scanCompleted(); - } - }); - } - - mToBeDeleted = ""; - mUndoBtn.setVisibility(View.GONE); - } - - private boolean isDirEmpty() { - if (mMedia.size() <= 0) { - deleteDirectoryIfEmpty(); - finish(); - return true; - } - return false; - } - - private void editMedium() { - new RenameFileDialog(this, getCurrentFile(), new RenameFileDialog.OnRenameFileListener() { - @Override - public void onRenameFileSuccess(@NotNull File newFile) { - mMedia.get(mPager.getCurrentItem()).setPath(newFile.getAbsolutePath()); - updateActionbarTitle(); - } - }); - } - - private void reloadViewPager() { - final MyPagerAdapter adapter = (MyPagerAdapter) mPager.getAdapter(); - final int curPos = mPager.getCurrentItem(); - mMedia = getMedia(); - if (isDirEmpty()) - return; - - mPager.setAdapter(null); - adapter.updateItems(mMedia); - mPager.setAdapter(adapter); - - final int newPos = Math.min(curPos, adapter.getCount()); - mPager.setCurrentItem(newPos); - updateActionbarTitle(); - } - - private void deleteDirectoryIfEmpty() { - final File file = new File(mDirectory); - if (file.isDirectory() && file.listFiles().length == 0) { - file.delete(); - } - - Utils.Companion.scanPath(getApplicationContext(), mDirectory); - } - - private List getMedia() { - final List media = new ArrayList<>(); - final ArrayList invalidFiles = new ArrayList<>(); - for (int i = 0; i < 2; i++) { - Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; - if (i == 1) { - uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; - } - final String where = MediaStore.Images.Media.DATA + " like ? "; - final String[] args = new String[]{mDirectory + "%"}; - final String[] columns = {MediaStore.Images.Media.DATA, MediaStore.Images.Media.DATE_MODIFIED, MediaStore.Images.Media.SIZE}; - final Cursor cursor = getContentResolver().query(uri, columns, where, args, null); - final String pattern = Pattern.quote(mDirectory) + "/[^/]*"; - - if (cursor != null) { - if (cursor.moveToFirst()) { - final int pathIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA); - do { - final String curPath = cursor.getString(pathIndex); - if (curPath == null) - continue; - - final File file = new File(curPath); - if (!file.exists()) { - invalidFiles.add(file); - continue; - } - - if (curPath.matches(pattern) && !curPath.equals(mToBeDeleted) && !curPath.equals(mBeingDeleted)) { - final int dateIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATE_MODIFIED); - final long timestamp = cursor.getLong(dateIndex); - - final int sizeIndex = cursor.getColumnIndex(MediaStore.Images.Media.SIZE); - final long size = cursor.getLong(sizeIndex); - media.add(new Medium(file.getName(), curPath, i == 1, timestamp, size)); - } - } while (cursor.moveToNext()); - } - cursor.close(); - } - } - - Utils.Companion.scanFiles(getApplicationContext(), invalidFiles); - Medium.Companion.setSorting(mConfig.getSorting()); - Collections.sort(media); - int j = 0; - for (Medium medium : media) { - if (medium.getPath().equals(mPath)) { - mPos = j; - break; - } - j++; - } - return media; - } - - @Override - public void fragmentClicked() { - deleteFile(); - mIsFullScreen = !mIsFullScreen; - if (mIsFullScreen) { - hideSystemUI(); - } else { - showSystemUI(); - } - } - - private void hideSystemUI() { - Utils.Companion.hideSystemUI(mActionbar, getWindow()); - } - - private void showSystemUI() { - Utils.Companion.showSystemUI(mActionbar, getWindow()); - } - - private void updateActionbarTitle() { - setTitle(Utils.Companion.getFilename(mMedia.get(mPager.getCurrentItem()).getPath())); - } - - private Medium getCurrentMedium() { - if (mPos >= mMedia.size()) - mPos = mMedia.size() - 1; - return mMedia.get(mPos); - } - - private File getCurrentFile() { - return new File(getCurrentMedium().getPath()); - } - - private void addUndoMargin() { - final Resources res = getResources(); - final RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mUndoBtn.getLayoutParams(); - final int topMargin = Utils.Companion.getStatusBarHeight(res) + Utils.Companion.getActionBarHeight(getApplicationContext(), res); - int rightMargin = params.rightMargin; - - if (getResources().getConfiguration().orientation != Configuration.ORIENTATION_PORTRAIT) { - rightMargin += Utils.Companion.getNavBarHeight(res); - } - - params.setMargins(params.leftMargin, topMargin, rightMargin, params.bottomMargin); - } - - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - - } - - @Override - public void onPageSelected(int position) { - updateActionbarTitle(); - mPos = position; - supportInvalidateOptionsMenu(); - } - - @Override - public void onPageScrollStateChanged(int state) { - if (state == ViewPager.SCROLL_STATE_DRAGGING) { - final MyPagerAdapter adapter = (MyPagerAdapter) mPager.getAdapter(); - adapter.itemDragged(mPos); - } - } - - @Override - public void onSystemUiVisibilityChange(int visibility) { - if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { - mIsFullScreen = false; - } - - final MyPagerAdapter adapter = (MyPagerAdapter) mPager.getAdapter(); - adapter.updateUiVisibility(mIsFullScreen, mPos); - } - - private void scanCompleted() { - mBeingDeleted = ""; - runOnUiThread(new Runnable() { - @Override - public void run() { - if (mMedia != null && mMedia.size() <= 1) { - reloadViewPager(); - } - } - }); - } - - @Override - public boolean onTouch(View v, MotionEvent event) { - if (mIsUndoShown) { - deleteFile(); - } - - return false; - } - - @Override - protected void onPause() { - super.onPause(); - deleteFile(); - } -} diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt new file mode 100644 index 000000000..a553e274d --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt @@ -0,0 +1,472 @@ +package com.simplemobiletools.gallery.activities + +import android.app.Activity +import android.content.Intent +import android.content.res.Configuration +import android.database.Cursor +import android.net.Uri +import android.os.Bundle +import android.provider.MediaStore +import android.support.v4.view.ViewPager +import android.support.v7.app.ActionBar +import android.view.Menu +import android.view.MenuItem +import android.view.View +import android.widget.RelativeLayout +import com.simplemobiletools.filepicker.asynctasks.CopyMoveTask +import com.simplemobiletools.filepicker.extensions.* +import com.simplemobiletools.fileproperties.dialogs.PropertiesDialog +import com.simplemobiletools.gallery.Constants +import com.simplemobiletools.gallery.R +import com.simplemobiletools.gallery.Utils +import com.simplemobiletools.gallery.adapters.MyPagerAdapter +import com.simplemobiletools.gallery.dialogs.CopyDialog +import com.simplemobiletools.gallery.dialogs.RenameFileDialog +import com.simplemobiletools.gallery.fragments.ViewPagerFragment +import com.simplemobiletools.gallery.models.Medium +import kotlinx.android.synthetic.main.activity_medium.* +import java.io.File +import java.util.* +import java.util.regex.Pattern + +class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View.OnSystemUiVisibilityChangeListener, ViewPagerFragment.FragmentClickListener { + private var mActionbar: ActionBar? = null + private var mMedia: MutableList? = null + private var mPath = "" + private var mDirectory = "" + private var mToBeDeleted = "" + private var mBeingDeleted = "" + + private var mIsFullScreen = false + private var mIsUndoShown = false + private var mPos = 0 + + companion object { + private val EDIT_IMAGE = 1 + private val SET_WALLPAPER = 2 + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_medium) + + if (!hasStoragePermission()) { + finish() + return + } + + val uri = intent.data + if (uri != null) { + var cursor: Cursor? = null + try { + val proj = arrayOf(MediaStore.Images.Media.DATA) + cursor = contentResolver.query(uri, proj, null, null, null) + if (cursor != null) { + val dataIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA) + cursor.moveToFirst() + mPath = cursor.getString(dataIndex) + } + } finally { + cursor?.close() + } + } else { + mPath = intent.getStringExtra(Constants.MEDIUM) + } + + if (mPath.isEmpty()) { + toast(R.string.unknown_error) + finish() + return + } + + mPos = 0 + mIsFullScreen = true + mActionbar = supportActionBar + mToBeDeleted = "" + mBeingDeleted = "" + hideSystemUI() + + scanPath(mPath) {} + addUndoMargin() + mDirectory = File(mPath).parent + mMedia = getMedia() + if (isDirEmpty()) + return + + val pagerAdapter = MyPagerAdapter(this, supportFragmentManager, mMedia!!) + view_pager.apply { + adapter = pagerAdapter + currentItem = mPos + addOnPageChangeListener(this@ViewPagerActivity) + } + + window.decorView.setOnSystemUiVisibilityChangeListener(this) + updateActionbarTitle() + undo_delete.setOnClickListener { undoDeletion() } + } + + override fun onResume() { + super.onResume() + if (!hasStoragePermission()) { + finish() + } + } + + fun undoDeletion() { + mIsUndoShown = false + mToBeDeleted = "" + mBeingDeleted = "" + undo_delete.visibility = View.GONE + reloadViewPager() + } + + override fun onCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.viewpager_menu, menu) + menu.findItem(R.id.menu_set_as_wallpaper).isVisible = getCurrentMedium().isImage + menu.findItem(R.id.menu_edit).isVisible = getCurrentMedium().isImage + return true + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + deleteFile() + return when (item.itemId) { + R.id.menu_set_as_wallpaper -> { + setAsWallpaper() + true + } + R.id.menu_copy_move -> { + displayCopyDialog() + true + } + R.id.menu_open_with -> { + openWith() + true + } + R.id.menu_share -> { + shareMedium() + true + } + R.id.menu_delete -> { + notifyDeletion() + true + } + R.id.menu_rename -> { + editMedium() + true + } + R.id.menu_edit -> { + openEditor() + true + } + R.id.menu_properties -> { + showProperties() + true + } + else -> super.onOptionsItemSelected(item) + } + } + + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + val adapter = view_pager.adapter as MyPagerAdapter + adapter.updateItems(mPos) + } + + private fun displayCopyDialog() { + val files = ArrayList() + files.add(getCurrentFile()) + CopyDialog(this, files, object : CopyMoveTask.CopyMoveListener { + override fun copySucceeded(deleted: Boolean, copiedAll: Boolean) { + val msgId: Int + if (deleted) { + reloadViewPager() + msgId = if (copiedAll) R.string.moving_success else R.string.moving_success_partial + } else { + msgId = if (copiedAll) R.string.copying_success else R.string.copying_success_partial + } + toast(msgId) + } + + override fun copyFailed() { + toast(R.string.copy_move_failed) + } + }) + } + + private fun openEditor() { + val intent = Intent(Intent.ACTION_EDIT) + intent.setDataAndType(Uri.fromFile(getCurrentFile()), "image/*") + val chooser = Intent.createChooser(intent, getString(R.string.edit_image_with)) + + if (intent.resolveActivity(packageManager) != null) { + startActivityForResult(chooser, EDIT_IMAGE) + } else { + toast(R.string.no_editor_found) + } + } + + private fun setAsWallpaper() { + val intent = Intent(Intent.ACTION_ATTACH_DATA) + intent.setDataAndType(Uri.fromFile(getCurrentFile()), "image/jpeg") + val chooser = Intent.createChooser(intent, getString(R.string.set_as_wallpaper_with)) + + if (intent.resolveActivity(packageManager) != null) { + startActivityForResult(chooser, SET_WALLPAPER) + } else { + toast(R.string.no_wallpaper_setter_found) + } + } + + private fun openWith() { + val intent = Intent(Intent.ACTION_VIEW) + intent.setDataAndType(Uri.fromFile(getCurrentFile()), getCurrentMedium().getMimeType()) + val chooser = Intent.createChooser(intent, getString(R.string.open_with)) + + if (intent.resolveActivity(packageManager) != null) { + startActivity(chooser) + } else { + toast(R.string.no_app_found) + } + } + + private fun showProperties() { + PropertiesDialog(this, getCurrentFile().absolutePath, false) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { + if (requestCode == EDIT_IMAGE) { + if (resultCode == Activity.RESULT_OK && resultData != null) { + val adapter = view_pager.adapter as MyPagerAdapter + adapter.updateItems(mPos) + } + } else if (requestCode == SET_WALLPAPER) { + if (resultCode == Activity.RESULT_OK) { + toast(R.string.wallpaper_set_successfully) + } + } + super.onActivityResult(requestCode, resultCode, resultData) + } + + private fun shareMedium() { + Utils.shareMedium(getCurrentMedium(), this) + } + + private fun notifyDeletion() { + if (isShowingPermDialog(File(mPath))) + return + + mToBeDeleted = getCurrentFile().absolutePath + if (mMedia!!.size <= 1) { + deleteFile() + } else { + toast(R.string.file_deleted) + undo_delete.visibility = View.VISIBLE + mIsUndoShown = true + reloadViewPager() + } + } + + private fun deleteFile() { + if (mToBeDeleted.isEmpty()) + return + + mIsUndoShown = false + mBeingDeleted = "" + var mWasFileDeleted = false + + val file = File(mToBeDeleted) + if (needsStupidWritePermissions(mToBeDeleted)) { + if (!isShowingPermDialog(file)) { + val document = getFileDocument(mToBeDeleted, mConfig.treeUri) + if (document.canWrite()) { + mWasFileDeleted = document.delete() + } + } + } else { + mWasFileDeleted = file.delete() + } + + if (mWasFileDeleted) { + mBeingDeleted = mToBeDeleted + scanPath(mToBeDeleted) { scanCompleted() } + } + + mToBeDeleted = "" + undo_delete.visibility = View.GONE + } + + private fun isDirEmpty(): Boolean { + return if (mMedia!!.size <= 0) { + deleteDirectoryIfEmpty() + finish() + true + } else + false + } + + private fun editMedium() { + RenameFileDialog(this, getCurrentFile(), object : RenameFileDialog.OnRenameFileListener { + override fun onRenameFileSuccess(newFile: File) { + mMedia!![view_pager.currentItem].path = newFile.absolutePath + updateActionbarTitle() + } + }) + } + + private fun reloadViewPager() { + val adapter = view_pager.adapter as MyPagerAdapter + val curPos = view_pager.currentItem + mMedia = getMedia() + if (isDirEmpty()) + return + + view_pager.adapter = null + adapter.updateItems(mMedia!!) + view_pager.adapter = adapter + + val newPos = Math.min(curPos, adapter.count) + view_pager.currentItem = newPos + updateActionbarTitle() + } + + private fun deleteDirectoryIfEmpty() { + val file = File(mDirectory) + if (file.isDirectory && file.listFiles().size == 0) { + file.delete() + } + + scanPath(mDirectory) {} + } + + private fun getMedia(): MutableList { + val media = ArrayList() + val invalidFiles = ArrayList() + for (i in 0..1) { + var uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI + if (i == 1) { + uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI + } + + val where = "${MediaStore.Images.Media.DATA} like ? " + val args = arrayOf("$mDirectory%") + val columns = arrayOf(MediaStore.Images.Media.DATA, MediaStore.Images.Media.DATE_MODIFIED, MediaStore.Images.Media.SIZE) + val cursor = contentResolver.query(uri, columns, where, args, null) + val pattern = "${Pattern.quote(mDirectory)}/[^/]*" + + if (cursor?.moveToFirst() == true) { + val pathIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA) + do { + val curPath = cursor.getString(pathIndex) ?: continue + + val file = File(curPath) + if (!file.exists()) { + invalidFiles.add(file) + continue + } + + if (curPath.matches(pattern.toRegex()) && curPath != mToBeDeleted && curPath != mBeingDeleted) { + val dateIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATE_MODIFIED) + val timestamp = cursor.getLong(dateIndex) + + val sizeIndex = cursor.getColumnIndex(MediaStore.Images.Media.SIZE) + val size = cursor.getLong(sizeIndex) + media.add(Medium(file.name, curPath, i == 1, timestamp, size)) + } + } while (cursor.moveToNext()) + } + cursor?.close() + } + + scanFiles(invalidFiles) {} + Medium.sorting = mConfig.sorting + Collections.sort(media) + var j = 0 + for (medium in media) { + if (medium.path == mPath) { + mPos = j + break + } + j++ + } + return media + } + + override fun fragmentClicked() { + deleteFile() + mIsFullScreen = !mIsFullScreen + if (mIsFullScreen) { + hideSystemUI() + } else { + showSystemUI() + } + } + + private fun hideSystemUI() = Utils.hideSystemUI(mActionbar, window) + + private fun showSystemUI() = Utils.showSystemUI(mActionbar, window) + + private fun updateActionbarTitle() { + title = mMedia!![view_pager.currentItem].path.getFilenameFromPath() + } + + private fun getCurrentMedium(): Medium { + if (mPos >= mMedia!!.size) + mPos = mMedia!!.size - 1 + return mMedia!![mPos] + } + + private fun getCurrentFile() = File(getCurrentMedium().path) + + private fun addUndoMargin() { + val res = resources + val params = undo_delete.layoutParams as RelativeLayout.LayoutParams + val topMargin = Utils.getStatusBarHeight(res) + Utils.getActionBarHeight(applicationContext, res) + var rightMargin = params.rightMargin + + if (res.configuration.orientation != Configuration.ORIENTATION_PORTRAIT) { + rightMargin += Utils.getNavBarHeight(res) + } + + params.setMargins(params.leftMargin, topMargin, rightMargin, params.bottomMargin) + } + + override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { + + } + + override fun onPageSelected(position: Int) { + updateActionbarTitle() + mPos = position + supportInvalidateOptionsMenu() + } + + override fun onPageScrollStateChanged(state: Int) { + if (state == ViewPager.SCROLL_STATE_DRAGGING) { + val adapter = view_pager.adapter as MyPagerAdapter + adapter.itemDragged(mPos) + } + } + + override fun onSystemUiVisibilityChange(visibility: Int) { + if (visibility and View.SYSTEM_UI_FLAG_FULLSCREEN == 0) { + mIsFullScreen = false + } + + val adapter = view_pager.adapter as MyPagerAdapter + adapter.updateUiVisibility(mIsFullScreen, mPos) + } + + private fun scanCompleted() { + mBeingDeleted = "" + runOnUiThread { + if (mMedia != null && mMedia!!.size <= 1) { + reloadViewPager() + } + } + } + + override fun onPause() { + super.onPause() + deleteFile() + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt index d7ef3b110..a90693ea0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt @@ -11,6 +11,8 @@ class Medium(val name: String, var path: String, val isVideo: Boolean, val times val isImage: Boolean get() = !isGif && !isVideo + fun getMimeType() = if (isVideo) "video/*" else "image/*" + override fun compareTo(other: Medium): Int { var res: Int if (sorting and Constants.SORT_BY_NAME != 0) {