convert ViewPagerActivity to kotlin

This commit is contained in:
tibbi 2016-11-12 23:01:57 +01:00
parent 7ced072f9c
commit 719c510f59
4 changed files with 476 additions and 531 deletions

View file

@ -20,9 +20,7 @@ import java.util.*
class Utils { class Utils {
companion object { companion object {
fun getFilename(path: String): String { fun getFilename(path: String) = path.substring(path.lastIndexOf("/") + 1)
return path.substring(path.lastIndexOf("/") + 1)
}
fun showToast(context: Context, resId: Int) { fun showToast(context: Context, resId: Int) {
context.toast(resId) context.toast(resId)
@ -94,12 +92,10 @@ class Utils {
val uri = Uri.fromFile(file) val uri = Uri.fromFile(file)
intent.action = Intent.ACTION_SEND intent.action = Intent.ACTION_SEND
intent.putExtra(Intent.EXTRA_STREAM, uri) intent.putExtra(Intent.EXTRA_STREAM, uri)
intent.type = getMimeType(medium) intent.type = medium.getMimeType()
activity.startActivity(Intent.createChooser(intent, shareTitle)) activity.startActivity(Intent.createChooser(intent, shareTitle))
} }
fun getMimeType(medium: Medium) = if (medium.isVideo) "video/*" else "image/*"
fun showSystemUI(actionbar: ActionBar?, window: Window) { fun showSystemUI(actionbar: ActionBar?, window: Window) {
actionbar?.show() actionbar?.show()

View file

@ -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<Medium> 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<File> 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<Medium> getMedia() {
final List<Medium> media = new ArrayList<>();
final ArrayList<File> 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();
}
}

View file

@ -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<Medium>? = 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<File>()
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<Medium> {
val media = ArrayList<Medium>()
val invalidFiles = ArrayList<File>()
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()
}
}

View file

@ -11,6 +11,8 @@ class Medium(val name: String, var path: String, val isVideo: Boolean, val times
val isImage: Boolean val isImage: Boolean
get() = !isGif && !isVideo get() = !isGif && !isVideo
fun getMimeType() = if (isVideo) "video/*" else "image/*"
override fun compareTo(other: Medium): Int { override fun compareTo(other: Medium): Int {
var res: Int var res: Int
if (sorting and Constants.SORT_BY_NAME != 0) { if (sorting and Constants.SORT_BY_NAME != 0) {