convert MainActivity to kotlin, part 1
This commit is contained in:
parent
695cebe74c
commit
9616e914b9
4 changed files with 534 additions and 615 deletions
|
@ -1,608 +0,0 @@
|
||||||
package com.simplemobiletools.gallery.activities;
|
|
||||||
|
|
||||||
import android.Manifest;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.graphics.Color;
|
|
||||||
import android.media.MediaScannerConnection;
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.Parcelable;
|
|
||||||
import android.provider.MediaStore;
|
|
||||||
import android.support.design.widget.CoordinatorLayout;
|
|
||||||
import android.support.design.widget.Snackbar;
|
|
||||||
import android.support.v4.app.ActivityCompat;
|
|
||||||
import android.support.v4.provider.DocumentFile;
|
|
||||||
import android.support.v4.widget.SwipeRefreshLayout;
|
|
||||||
import android.util.SparseBooleanArray;
|
|
||||||
import android.view.ActionMode;
|
|
||||||
import android.view.Menu;
|
|
||||||
import android.view.MenuInflater;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.MotionEvent;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.AdapterView;
|
|
||||||
import android.widget.GridView;
|
|
||||||
|
|
||||||
import com.simplemobiletools.filepicker.asynctasks.CopyMoveTask;
|
|
||||||
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.DirectoryAdapter;
|
|
||||||
import com.simplemobiletools.gallery.asynctasks.GetDirectoriesAsynctask;
|
|
||||||
import com.simplemobiletools.gallery.dialogs.ChangeSortingDialog;
|
|
||||||
import com.simplemobiletools.gallery.dialogs.CopyDialog;
|
|
||||||
import com.simplemobiletools.gallery.dialogs.RenameDirectoryDialog;
|
|
||||||
import com.simplemobiletools.gallery.models.Directory;
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import butterknife.BindView;
|
|
||||||
import butterknife.ButterKnife;
|
|
||||||
|
|
||||||
public class MainActivity extends SimpleActivity
|
|
||||||
implements AdapterView.OnItemClickListener, GridView.MultiChoiceModeListener, GridView.OnTouchListener,
|
|
||||||
SwipeRefreshLayout.OnRefreshListener, GetDirectoriesAsynctask.GetDirectoriesListener {
|
|
||||||
@BindView(R.id.directories_grid) GridView mGridView;
|
|
||||||
@BindView(R.id.directories_holder) SwipeRefreshLayout mSwipeRefreshLayout;
|
|
||||||
|
|
||||||
private static final int STORAGE_PERMISSION = 1;
|
|
||||||
private static final int PICK_MEDIA = 2;
|
|
||||||
private static final int PICK_WALLPAPER = 3;
|
|
||||||
|
|
||||||
private static List<Directory> mDirs;
|
|
||||||
private static Snackbar mSnackbar;
|
|
||||||
private static List<String> mToBeDeleted;
|
|
||||||
private static ActionMode mActionMode;
|
|
||||||
private static Parcelable mState;
|
|
||||||
|
|
||||||
private static boolean mIsSnackbarShown;
|
|
||||||
private static boolean mIsPickImageIntent;
|
|
||||||
private static boolean mIsPickVideoIntent;
|
|
||||||
private static boolean mIsGetImageContentIntent;
|
|
||||||
private static boolean mIsGetVideoContentIntent;
|
|
||||||
private static boolean mIsGetAnyContentIntent;
|
|
||||||
private static boolean mIsSetWallpaperIntent;
|
|
||||||
private static boolean mIsThirdPartyIntent;
|
|
||||||
private static boolean mIsGettingDirs;
|
|
||||||
private static int mSelectedItemsCnt;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
setContentView(R.layout.activity_main);
|
|
||||||
ButterKnife.bind(this);
|
|
||||||
|
|
||||||
final Intent intent = getIntent();
|
|
||||||
mIsPickImageIntent = isPickImageIntent(intent);
|
|
||||||
mIsPickVideoIntent = isPickVideoIntent(intent);
|
|
||||||
mIsGetImageContentIntent = isGetImageContentIntent(intent);
|
|
||||||
mIsGetVideoContentIntent = isGetVideoContentIntent(intent);
|
|
||||||
mIsGetAnyContentIntent = isGetAnyContentIntent(intent);
|
|
||||||
mIsSetWallpaperIntent = isSetWallpaperIntent(intent);
|
|
||||||
mIsThirdPartyIntent = mIsPickImageIntent || mIsPickVideoIntent || mIsGetImageContentIntent || mIsGetVideoContentIntent ||
|
|
||||||
mIsGetAnyContentIntent || mIsSetWallpaperIntent;
|
|
||||||
|
|
||||||
mToBeDeleted = new ArrayList<>();
|
|
||||||
mSwipeRefreshLayout.setOnRefreshListener(this);
|
|
||||||
mDirs = new ArrayList<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onCreateOptionsMenu(Menu menu) {
|
|
||||||
if (mIsThirdPartyIntent)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
getMenuInflater().inflate(R.menu.menu_main, menu);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
|
||||||
switch (item.getItemId()) {
|
|
||||||
case R.id.sort:
|
|
||||||
showSortingDialog();
|
|
||||||
return true;
|
|
||||||
case R.id.camera:
|
|
||||||
startActivity(new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA));
|
|
||||||
return true;
|
|
||||||
case R.id.settings:
|
|
||||||
startActivity(new Intent(getApplicationContext(), SettingsActivity.class));
|
|
||||||
return true;
|
|
||||||
case R.id.about:
|
|
||||||
startActivity(new Intent(getApplicationContext(), AboutActivity.class));
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
return super.onOptionsItemSelected(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onResume() {
|
|
||||||
super.onResume();
|
|
||||||
tryloadGallery();
|
|
||||||
if (mState != null && mGridView != null)
|
|
||||||
mGridView.onRestoreInstanceState(mState);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onPause() {
|
|
||||||
super.onPause();
|
|
||||||
deleteDirs();
|
|
||||||
if (mGridView != null)
|
|
||||||
mState = mGridView.onSaveInstanceState();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDestroy() {
|
|
||||||
super.onDestroy();
|
|
||||||
mConfig.setFirstRun(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void tryloadGallery() {
|
|
||||||
if (Utils.Companion.hasStoragePermission(getApplicationContext())) {
|
|
||||||
getDirectories();
|
|
||||||
} else {
|
|
||||||
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, STORAGE_PERMISSION);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
|
|
||||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
|
||||||
|
|
||||||
if (requestCode == STORAGE_PERMISSION) {
|
|
||||||
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
|
||||||
getDirectories();
|
|
||||||
} else {
|
|
||||||
Utils.Companion.showToast(getApplicationContext(), R.string.no_permissions);
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void getDirectories() {
|
|
||||||
if (mIsGettingDirs)
|
|
||||||
return;
|
|
||||||
|
|
||||||
mIsGettingDirs = true;
|
|
||||||
new GetDirectoriesAsynctask(getApplicationContext(), mIsPickVideoIntent || mIsGetVideoContentIntent, mIsPickImageIntent || mIsGetImageContentIntent,
|
|
||||||
mToBeDeleted, this).execute();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void showSortingDialog() {
|
|
||||||
new ChangeSortingDialog(this, true, new ChangeSortingDialog.OnChangeSortingListener() {
|
|
||||||
@Override
|
|
||||||
public void sortingChanged() {
|
|
||||||
getDirectories();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void prepareForDeleting() {
|
|
||||||
Utils.Companion.showToast(this, R.string.deleting);
|
|
||||||
final SparseBooleanArray items = mGridView.getCheckedItemPositions();
|
|
||||||
final int cnt = items.size();
|
|
||||||
int deletedCnt = 0;
|
|
||||||
for (int i = 0; i < cnt; i++) {
|
|
||||||
if (items.valueAt(i)) {
|
|
||||||
final int id = items.keyAt(i);
|
|
||||||
final String path = mDirs.get(id).getPath();
|
|
||||||
mToBeDeleted.add(path);
|
|
||||||
deletedCnt++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (String path : mToBeDeleted) {
|
|
||||||
if (isShowingPermDialog(new File(path))) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
notifyDeletion(deletedCnt);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void notifyDeletion(int cnt) {
|
|
||||||
getDirectories();
|
|
||||||
|
|
||||||
final CoordinatorLayout coordinator = (CoordinatorLayout) findViewById(R.id.coordinator_layout);
|
|
||||||
final Resources res = getResources();
|
|
||||||
final String msg = res.getQuantityString(R.plurals.folders_deleted, cnt, cnt);
|
|
||||||
mSnackbar = Snackbar.make(coordinator, msg, Snackbar.LENGTH_INDEFINITE);
|
|
||||||
mSnackbar.setAction(res.getString(R.string.undo), undoDeletion);
|
|
||||||
mSnackbar.setActionTextColor(Color.WHITE);
|
|
||||||
mSnackbar.show();
|
|
||||||
mIsSnackbarShown = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void deleteDirs() {
|
|
||||||
if (mToBeDeleted == null || mToBeDeleted.isEmpty())
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (mSnackbar != null) {
|
|
||||||
mSnackbar.dismiss();
|
|
||||||
}
|
|
||||||
|
|
||||||
mIsSnackbarShown = false;
|
|
||||||
|
|
||||||
final ArrayList<File> updatedFiles = new ArrayList<>();
|
|
||||||
for (String delPath : mToBeDeleted) {
|
|
||||||
final File dir = new File(delPath);
|
|
||||||
if (dir.exists()) {
|
|
||||||
final File[] files = dir.listFiles();
|
|
||||||
for (File file : files) {
|
|
||||||
if (file.isFile() && Utils.Companion.isPhotoVideo(file)) {
|
|
||||||
updatedFiles.add(file);
|
|
||||||
deleteItem(file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
updatedFiles.add(dir);
|
|
||||||
if (dir.listFiles().length == 0)
|
|
||||||
deleteItem(dir);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Utils.Companion.scanFiles(getApplicationContext(), updatedFiles);
|
|
||||||
mToBeDeleted.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void deleteItem(File file) {
|
|
||||||
if (Utils.Companion.needsStupidWritePermissions(this, file.getAbsolutePath())) {
|
|
||||||
if (!isShowingPermDialog(file)) {
|
|
||||||
final DocumentFile document = Utils.Companion.getFileDocument(this, file.getAbsolutePath(), mConfig.getTreeUri());
|
|
||||||
document.delete();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
file.delete();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private View.OnClickListener undoDeletion = new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
mSnackbar.dismiss();
|
|
||||||
mIsSnackbarShown = false;
|
|
||||||
mToBeDeleted.clear();
|
|
||||||
getDirectories();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private void showProperties() {
|
|
||||||
final SparseBooleanArray items = mGridView.getCheckedItemPositions();
|
|
||||||
if (items.size() == 1) {
|
|
||||||
new PropertiesDialog(this, (String) getSelectedPaths().toArray()[0], false);
|
|
||||||
} else {
|
|
||||||
final List<String> paths = new ArrayList<>(items.size());
|
|
||||||
final int cnt = items.size();
|
|
||||||
for (int i = 0; i < cnt; i++) {
|
|
||||||
if (items.valueAt(i)) {
|
|
||||||
final int id = items.keyAt(i);
|
|
||||||
paths.add(mDirs.get(id).getPath());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
new PropertiesDialog(this, paths, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void editDirectory() {
|
|
||||||
final SparseBooleanArray items = mGridView.getCheckedItemPositions();
|
|
||||||
final int cnt = items.size();
|
|
||||||
for (int i = 0; i < cnt; i++) {
|
|
||||||
if (items.valueAt(i)) {
|
|
||||||
final int id = items.keyAt(i);
|
|
||||||
final String path = mDirs.get(id).getPath();
|
|
||||||
renameDir(path);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void renameDir(final String path) {
|
|
||||||
final File dir = new File(path);
|
|
||||||
if (Utils.Companion.isAStorageRootFolder(this, path)) {
|
|
||||||
Utils.Companion.showToast(this, R.string.rename_folder_root);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
new RenameDirectoryDialog(this, dir, new RenameDirectoryDialog.OnRenameDirListener() {
|
|
||||||
@Override
|
|
||||||
public void onRenameDirSuccess(@NotNull String[] changedFiles) {
|
|
||||||
mActionMode.finish();
|
|
||||||
MediaScannerConnection.scanFile(getApplicationContext(), changedFiles, null, new MediaScannerConnection.OnScanCompletedListener() {
|
|
||||||
@Override
|
|
||||||
public void onScanCompleted(String path, Uri uri) {
|
|
||||||
scanCompleted(path);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void displayCopyDialog() {
|
|
||||||
final ArrayList<File> files = new ArrayList<>();
|
|
||||||
final SparseBooleanArray items = mGridView.getCheckedItemPositions();
|
|
||||||
final int cnt = items.size();
|
|
||||||
for (int i = 0; i < cnt; i++) {
|
|
||||||
if (items.valueAt(i)) {
|
|
||||||
final int id = items.keyAt(i);
|
|
||||||
final File dir = new File(mDirs.get(id).getPath());
|
|
||||||
files.addAll(Arrays.asList(dir.listFiles()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
new CopyDialog(this, files, new CopyMoveTask.CopyMoveListener() {
|
|
||||||
@Override
|
|
||||||
public void copySucceeded(boolean deleted, boolean copiedAll) {
|
|
||||||
int msgId;
|
|
||||||
if (deleted) {
|
|
||||||
getDirectories();
|
|
||||||
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 boolean isPickImageIntent(Intent intent) {
|
|
||||||
return isPickIntent(intent) && (hasImageContentData(intent) || isImageType(intent));
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isPickVideoIntent(Intent intent) {
|
|
||||||
return isPickIntent(intent) && (hasVideoContentData(intent) || isVideoType(intent));
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isPickIntent(Intent intent) {
|
|
||||||
return intent != null && intent.getAction() != null && intent.getAction().equals(Intent.ACTION_PICK);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isGetContentIntent(Intent intent) {
|
|
||||||
return intent != null && intent.getAction() != null && intent.getAction().equals(Intent.ACTION_GET_CONTENT) &&
|
|
||||||
intent.getType() != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isGetImageContentIntent(Intent intent) {
|
|
||||||
return isGetContentIntent(intent) &&
|
|
||||||
(intent.getType().startsWith("image/") || intent.getType().equals(MediaStore.Images.Media.CONTENT_TYPE));
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isGetVideoContentIntent(Intent intent) {
|
|
||||||
return isGetContentIntent(intent) &&
|
|
||||||
(intent.getType().startsWith("video/") || intent.getType().equals(MediaStore.Video.Media.CONTENT_TYPE));
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isGetAnyContentIntent(Intent intent) {
|
|
||||||
return isGetContentIntent(intent) && intent.getType().equals("*/*");
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isSetWallpaperIntent(Intent intent) {
|
|
||||||
return intent != null && intent.getAction() != null && intent.getAction().equals(Intent.ACTION_SET_WALLPAPER);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean hasImageContentData(Intent intent) {
|
|
||||||
final Uri data = intent.getData();
|
|
||||||
return data != null && data.equals(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean hasVideoContentData(Intent intent) {
|
|
||||||
final Uri data = intent.getData();
|
|
||||||
return data != null && data.equals(MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isImageType(Intent intent) {
|
|
||||||
final String type = intent.getType();
|
|
||||||
return type != null && (type.startsWith("image/") || type.equals(MediaStore.Images.Media.CONTENT_TYPE));
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isVideoType(Intent intent) {
|
|
||||||
final String type = intent.getType();
|
|
||||||
return type != null && (type.startsWith("video/") || type.equals(MediaStore.Video.Media.CONTENT_TYPE));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onActivityResult(int requestCode, int resultCode, Intent resultData) {
|
|
||||||
if (resultCode == RESULT_OK) {
|
|
||||||
if (requestCode == PICK_MEDIA && resultData != null) {
|
|
||||||
final Intent result = new Intent();
|
|
||||||
final String path = resultData.getData().getPath();
|
|
||||||
final Uri uri = Uri.fromFile(new File(path));
|
|
||||||
if (mIsGetImageContentIntent || mIsGetVideoContentIntent || mIsGetAnyContentIntent) {
|
|
||||||
final String type = Utils.Companion.getMimeType(path);
|
|
||||||
result.setDataAndTypeAndNormalize(uri, type);
|
|
||||||
result.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
|
||||||
} else if (mIsPickImageIntent || mIsPickVideoIntent) {
|
|
||||||
result.setData(uri);
|
|
||||||
result.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
|
||||||
}
|
|
||||||
|
|
||||||
setResult(RESULT_OK, result);
|
|
||||||
finish();
|
|
||||||
} else if (requestCode == PICK_WALLPAPER) {
|
|
||||||
setResult(RESULT_OK);
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
super.onActivityResult(requestCode, resultCode, resultData);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
|
||||||
final Intent intent = new Intent(this, MediaActivity.class);
|
|
||||||
intent.putExtra(Constants.INSTANCE.getDIRECTORY(), mDirs.get(position).getPath());
|
|
||||||
|
|
||||||
if (mIsSetWallpaperIntent) {
|
|
||||||
intent.putExtra(Constants.INSTANCE.getSET_WALLPAPER_INTENT(), true);
|
|
||||||
startActivityForResult(intent, PICK_WALLPAPER);
|
|
||||||
} else {
|
|
||||||
intent.putExtra(Constants.INSTANCE.getGET_IMAGE_INTENT(), mIsPickImageIntent || mIsGetImageContentIntent);
|
|
||||||
intent.putExtra(Constants.INSTANCE.getGET_VIDEO_INTENT(), mIsPickVideoIntent || mIsGetVideoContentIntent);
|
|
||||||
intent.putExtra(Constants.INSTANCE.getGET_ANY_INTENT(), mIsGetAnyContentIntent);
|
|
||||||
startActivityForResult(intent, PICK_MEDIA);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
|
|
||||||
if (checked) {
|
|
||||||
mSelectedItemsCnt++;
|
|
||||||
} else {
|
|
||||||
mSelectedItemsCnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mSelectedItemsCnt > 0) {
|
|
||||||
mode.setTitle(String.valueOf(mSelectedItemsCnt));
|
|
||||||
}
|
|
||||||
|
|
||||||
mode.invalidate();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
|
|
||||||
final MenuInflater inflater = mode.getMenuInflater();
|
|
||||||
inflater.inflate(R.menu.cab_directories, menu);
|
|
||||||
mActionMode = mode;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
|
|
||||||
menu.findItem(R.id.cab_edit).setVisible(mSelectedItemsCnt == 1);
|
|
||||||
|
|
||||||
int hiddenCnt = 0;
|
|
||||||
int unhiddenCnt = 0;
|
|
||||||
final SparseBooleanArray items = mGridView.getCheckedItemPositions();
|
|
||||||
final int cnt = items.size();
|
|
||||||
for (int i = 0; i < cnt; i++) {
|
|
||||||
if (items.valueAt(i)) {
|
|
||||||
final int id = items.keyAt(i);
|
|
||||||
if (mConfig.getIsFolderHidden(mDirs.get(id).getPath()))
|
|
||||||
hiddenCnt++;
|
|
||||||
else
|
|
||||||
unhiddenCnt++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
menu.findItem(R.id.cab_hide).setVisible(unhiddenCnt > 0);
|
|
||||||
menu.findItem(R.id.cab_unhide).setVisible(hiddenCnt > 0);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
|
|
||||||
switch (item.getItemId()) {
|
|
||||||
case R.id.cab_properties:
|
|
||||||
showProperties();
|
|
||||||
return true;
|
|
||||||
case R.id.cab_edit:
|
|
||||||
editDirectory();
|
|
||||||
return true;
|
|
||||||
case R.id.cab_delete:
|
|
||||||
prepareForDeleting();
|
|
||||||
mode.finish();
|
|
||||||
return true;
|
|
||||||
case R.id.cab_hide:
|
|
||||||
hideFolders();
|
|
||||||
mode.finish();
|
|
||||||
return true;
|
|
||||||
case R.id.cab_unhide:
|
|
||||||
unhideFolders();
|
|
||||||
mode.finish();
|
|
||||||
return true;
|
|
||||||
case R.id.cab_copy_move:
|
|
||||||
displayCopyDialog();
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDestroyActionMode(ActionMode mode) {
|
|
||||||
mSelectedItemsCnt = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onTouch(View v, MotionEvent event) {
|
|
||||||
if (mIsSnackbarShown) {
|
|
||||||
deleteDirs();
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void hideFolders() {
|
|
||||||
mConfig.addHiddenDirectories(getSelectedPaths());
|
|
||||||
getDirectories();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void unhideFolders() {
|
|
||||||
mConfig.removeHiddenDirectories(getSelectedPaths());
|
|
||||||
getDirectories();
|
|
||||||
}
|
|
||||||
|
|
||||||
private Set<String> getSelectedPaths() {
|
|
||||||
final SparseBooleanArray items = mGridView.getCheckedItemPositions();
|
|
||||||
final Set<String> selectedPaths = new HashSet<>();
|
|
||||||
final int cnt = items.size();
|
|
||||||
for (int i = 0; i < cnt; i++) {
|
|
||||||
if (items.valueAt(i)) {
|
|
||||||
final int id = items.keyAt(i);
|
|
||||||
selectedPaths.add(mDirs.get(id).getPath());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return selectedPaths;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void scanCompleted(final String path) {
|
|
||||||
final File dir = new File(path);
|
|
||||||
if (dir.isDirectory()) {
|
|
||||||
getDirectories();
|
|
||||||
|
|
||||||
runOnUiThread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
Utils.Companion.showToast(getApplicationContext(), R.string.rename_folder_ok);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onRefresh() {
|
|
||||||
getDirectories();
|
|
||||||
mSwipeRefreshLayout.setRefreshing(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void gotDirectories(@NotNull ArrayList<Directory> dirs) {
|
|
||||||
mIsGettingDirs = false;
|
|
||||||
if (dirs.toString().equals(mDirs.toString())) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
mDirs = dirs;
|
|
||||||
|
|
||||||
final DirectoryAdapter adapter = new DirectoryAdapter(this, mDirs);
|
|
||||||
mGridView.setAdapter(adapter);
|
|
||||||
mGridView.setOnItemClickListener(this);
|
|
||||||
mGridView.setMultiChoiceModeListener(this);
|
|
||||||
mGridView.setOnTouchListener(this);
|
|
||||||
mGridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -97,10 +97,6 @@ class Utils {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isAStorageRootFolder(context: Context, path: String) = context.isAStorageRootFolder(path)
|
|
||||||
|
|
||||||
fun isPhotoVideo(file: File) = file.isPhotoVideo()
|
|
||||||
|
|
||||||
fun needsStupidWritePermissions(context: Context, path: String) = context.needsStupidWritePermissions(path)
|
fun needsStupidWritePermissions(context: Context, path: String) = context.needsStupidWritePermissions(path)
|
||||||
|
|
||||||
fun getFileDocument(context: Context, path: String, treeUri: String) = context.getFileDocument(path, treeUri)
|
fun getFileDocument(context: Context, path: String, treeUri: String) = context.getFileDocument(path, treeUri)
|
||||||
|
|
|
@ -0,0 +1,532 @@
|
||||||
|
package com.simplemobiletools.gallery.activities
|
||||||
|
|
||||||
|
import android.Manifest
|
||||||
|
import android.app.Activity
|
||||||
|
import android.content.Intent
|
||||||
|
import android.content.pm.PackageManager
|
||||||
|
import android.graphics.Color
|
||||||
|
import android.net.Uri
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.os.Parcelable
|
||||||
|
import android.provider.MediaStore
|
||||||
|
import android.support.design.widget.Snackbar
|
||||||
|
import android.support.v4.app.ActivityCompat
|
||||||
|
import android.support.v4.widget.SwipeRefreshLayout
|
||||||
|
import android.view.ActionMode
|
||||||
|
import android.view.Menu
|
||||||
|
import android.view.MenuItem
|
||||||
|
import android.view.View
|
||||||
|
import android.widget.AdapterView
|
||||||
|
import android.widget.GridView
|
||||||
|
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.DirectoryAdapter
|
||||||
|
import com.simplemobiletools.gallery.asynctasks.GetDirectoriesAsynctask
|
||||||
|
import com.simplemobiletools.gallery.dialogs.ChangeSortingDialog
|
||||||
|
import com.simplemobiletools.gallery.dialogs.CopyDialog
|
||||||
|
import com.simplemobiletools.gallery.dialogs.RenameDirectoryDialog
|
||||||
|
import com.simplemobiletools.gallery.models.Directory
|
||||||
|
import kotlinx.android.synthetic.main.activity_main.*
|
||||||
|
import java.io.File
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
class MainActivity : SimpleActivity(), AdapterView.OnItemClickListener, SwipeRefreshLayout.OnRefreshListener, GetDirectoriesAsynctask.GetDirectoriesListener {
|
||||||
|
companion object {
|
||||||
|
private val STORAGE_PERMISSION = 1
|
||||||
|
private val PICK_MEDIA = 2
|
||||||
|
private val PICK_WALLPAPER = 3
|
||||||
|
|
||||||
|
lateinit var mDirs: MutableList<Directory>
|
||||||
|
private var mSnackbar: Snackbar? = null
|
||||||
|
lateinit var mToBeDeleted: MutableList<String>
|
||||||
|
private var mActionMode: ActionMode? = null
|
||||||
|
private var mState: Parcelable? = null
|
||||||
|
|
||||||
|
private var mIsSnackbarShown = false
|
||||||
|
private var mIsPickImageIntent = false
|
||||||
|
private var mIsPickVideoIntent = false
|
||||||
|
private var mIsGetImageContentIntent = false
|
||||||
|
private var mIsGetVideoContentIntent = false
|
||||||
|
private var mIsGetAnyContentIntent = false
|
||||||
|
private var mIsSetWallpaperIntent = false
|
||||||
|
private var mIsThirdPartyIntent = false
|
||||||
|
private var mIsGettingDirs = false
|
||||||
|
private var mSelectedItemsCnt = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
setContentView(R.layout.activity_main)
|
||||||
|
|
||||||
|
mIsPickImageIntent = isPickImageIntent(intent)
|
||||||
|
mIsPickVideoIntent = isPickVideoIntent(intent)
|
||||||
|
mIsGetImageContentIntent = isGetImageContentIntent(intent)
|
||||||
|
mIsGetVideoContentIntent = isGetVideoContentIntent(intent)
|
||||||
|
mIsGetAnyContentIntent = isGetAnyContentIntent(intent)
|
||||||
|
mIsSetWallpaperIntent = isSetWallpaperIntent(intent)
|
||||||
|
mIsThirdPartyIntent = mIsPickImageIntent || mIsPickVideoIntent || mIsGetImageContentIntent || mIsGetVideoContentIntent ||
|
||||||
|
mIsGetAnyContentIntent || mIsSetWallpaperIntent
|
||||||
|
|
||||||
|
mToBeDeleted = ArrayList<String>()
|
||||||
|
directories_holder.setOnRefreshListener(this)
|
||||||
|
mDirs = ArrayList<Directory>()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||||
|
if (mIsThirdPartyIntent)
|
||||||
|
return false
|
||||||
|
|
||||||
|
menuInflater.inflate(R.menu.menu_main, menu)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
|
return when (item.itemId) {
|
||||||
|
R.id.sort -> {
|
||||||
|
showSortingDialog()
|
||||||
|
true
|
||||||
|
}
|
||||||
|
R.id.camera -> {
|
||||||
|
startActivity(Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA))
|
||||||
|
true
|
||||||
|
}
|
||||||
|
R.id.settings -> {
|
||||||
|
startActivity(Intent(applicationContext, SettingsActivity::class.java))
|
||||||
|
true
|
||||||
|
}
|
||||||
|
R.id.about -> {
|
||||||
|
startActivity(Intent(applicationContext, AboutActivity::class.java))
|
||||||
|
true
|
||||||
|
}
|
||||||
|
else -> super.onOptionsItemSelected(item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
tryloadGallery()
|
||||||
|
if (mState != null)
|
||||||
|
directories_grid.onRestoreInstanceState(mState)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onPause() {
|
||||||
|
super.onPause()
|
||||||
|
deleteDirs()
|
||||||
|
mState = directories_grid.onSaveInstanceState()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDestroy() {
|
||||||
|
super.onDestroy()
|
||||||
|
mConfig.isFirstRun = false
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun tryloadGallery() {
|
||||||
|
if (hasStoragePermission()) {
|
||||||
|
getDirectories()
|
||||||
|
} else {
|
||||||
|
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), STORAGE_PERMISSION)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
|
||||||
|
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
|
||||||
|
|
||||||
|
if (requestCode == STORAGE_PERMISSION) {
|
||||||
|
if (grantResults.size > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
||||||
|
getDirectories()
|
||||||
|
} else {
|
||||||
|
toast(R.string.no_permissions)
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getDirectories() {
|
||||||
|
if (mIsGettingDirs)
|
||||||
|
return
|
||||||
|
|
||||||
|
mIsGettingDirs = true
|
||||||
|
GetDirectoriesAsynctask(applicationContext, mIsPickVideoIntent || mIsGetVideoContentIntent, mIsPickImageIntent || mIsGetImageContentIntent,
|
||||||
|
mToBeDeleted, this).execute()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun showSortingDialog() {
|
||||||
|
ChangeSortingDialog(this, true, object : ChangeSortingDialog.OnChangeSortingListener {
|
||||||
|
override fun sortingChanged() {
|
||||||
|
getDirectories()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun prepareForDeleting() {
|
||||||
|
toast(R.string.deleting)
|
||||||
|
val items = directories_grid.checkedItemPositions
|
||||||
|
val cnt = items.size()
|
||||||
|
var deletedCnt = 0
|
||||||
|
for (i in 0..cnt - 1) {
|
||||||
|
if (items.valueAt(i)) {
|
||||||
|
val id = items.keyAt(i)
|
||||||
|
val path = mDirs[id].path
|
||||||
|
mToBeDeleted.add(path)
|
||||||
|
deletedCnt++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (path in mToBeDeleted) {
|
||||||
|
if (isShowingPermDialog(File(path))) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
notifyDeletion(deletedCnt)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun notifyDeletion(cnt: Int) {
|
||||||
|
getDirectories()
|
||||||
|
|
||||||
|
val res = resources
|
||||||
|
val msg = res.getQuantityString(R.plurals.folders_deleted, cnt, cnt)
|
||||||
|
mSnackbar = Snackbar.make(coordinator_layout, msg, Snackbar.LENGTH_INDEFINITE)
|
||||||
|
mSnackbar!!.apply {
|
||||||
|
setAction(res.getString(R.string.undo), undoDeletion)
|
||||||
|
setActionTextColor(Color.WHITE)
|
||||||
|
show()
|
||||||
|
}
|
||||||
|
mIsSnackbarShown = true
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun deleteDirs() {
|
||||||
|
if (mToBeDeleted.isEmpty())
|
||||||
|
return
|
||||||
|
|
||||||
|
mSnackbar?.dismiss()
|
||||||
|
mIsSnackbarShown = false
|
||||||
|
|
||||||
|
val updatedFiles = ArrayList<File>()
|
||||||
|
for (delPath in mToBeDeleted) {
|
||||||
|
val dir = File(delPath)
|
||||||
|
if (dir.exists()) {
|
||||||
|
val files = dir.listFiles()
|
||||||
|
for (file in files) {
|
||||||
|
if (file.isFile && file.isPhotoVideo()) {
|
||||||
|
updatedFiles.add(file)
|
||||||
|
deleteItem(file)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
updatedFiles.add(dir)
|
||||||
|
if (dir.listFiles().size == 0)
|
||||||
|
deleteItem(dir)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
scanFiles(updatedFiles) {}
|
||||||
|
mToBeDeleted.clear()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun deleteItem(file: File) {
|
||||||
|
if (needsStupidWritePermissions(file.absolutePath)) {
|
||||||
|
if (!isShowingPermDialog(file)) {
|
||||||
|
getFileDocument(file.absolutePath, mConfig.treeUri).delete()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
file.delete()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private val undoDeletion = View.OnClickListener {
|
||||||
|
mSnackbar!!.dismiss()
|
||||||
|
mIsSnackbarShown = false
|
||||||
|
mToBeDeleted.clear()
|
||||||
|
getDirectories()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun showProperties() {
|
||||||
|
val items = directories_grid.checkedItemPositions
|
||||||
|
if (items.size() == 1) {
|
||||||
|
PropertiesDialog(this, selectedPaths.toTypedArray()[0], false)
|
||||||
|
} else {
|
||||||
|
val paths = ArrayList<String>(items.size())
|
||||||
|
val cnt = items.size()
|
||||||
|
for (i in 0..cnt - 1) {
|
||||||
|
if (items.valueAt(i)) {
|
||||||
|
val id = items.keyAt(i)
|
||||||
|
paths.add(mDirs[id].path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertiesDialog(this, paths, false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun editDirectory() {
|
||||||
|
val items = directories_grid.checkedItemPositions
|
||||||
|
val cnt = items.size()
|
||||||
|
for (i in 0..cnt - 1) {
|
||||||
|
if (items.valueAt(i)) {
|
||||||
|
val id = items.keyAt(i)
|
||||||
|
val path = mDirs[id].path
|
||||||
|
renameDir(path)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun renameDir(path: String) {
|
||||||
|
val dir = File(path)
|
||||||
|
if (isAStorageRootFolder(path)) {
|
||||||
|
toast(R.string.rename_folder_root)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
RenameDirectoryDialog(this, dir, object : RenameDirectoryDialog.OnRenameDirListener {
|
||||||
|
override fun onRenameDirSuccess(changedPaths: ArrayList<String>) {
|
||||||
|
mActionMode!!.finish()
|
||||||
|
applicationContext.scanPaths(changedPaths) { scanCompleted(path) }
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun displayCopyDialog() {
|
||||||
|
val files = ArrayList<File>()
|
||||||
|
val items = directories_grid.checkedItemPositions
|
||||||
|
val cnt = items.size()
|
||||||
|
for (i in 0..cnt - 1) {
|
||||||
|
if (items.valueAt(i)) {
|
||||||
|
val id = items.keyAt(i)
|
||||||
|
val dir = File(mDirs[id].path)
|
||||||
|
files.addAll(dir.listFiles())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CopyDialog(this, files, object : CopyMoveTask.CopyMoveListener {
|
||||||
|
override fun copySucceeded(deleted: Boolean, copiedAll: Boolean) {
|
||||||
|
if (deleted) {
|
||||||
|
getDirectories()
|
||||||
|
toast(if (copiedAll) R.string.moving_success else R.string.moving_success_partial)
|
||||||
|
} else {
|
||||||
|
toast(if (copiedAll) R.string.copying_success else R.string.copying_success_partial)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun copyFailed() {
|
||||||
|
toast(R.string.copy_move_failed)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun isPickImageIntent(intent: Intent) = isPickIntent(intent) && (hasImageContentData(intent) || isImageType(intent))
|
||||||
|
|
||||||
|
private fun isPickVideoIntent(intent: Intent) = isPickIntent(intent) && (hasVideoContentData(intent) || isVideoType(intent))
|
||||||
|
|
||||||
|
private fun isPickIntent(intent: Intent) = intent.action == Intent.ACTION_PICK
|
||||||
|
|
||||||
|
private fun isGetContentIntent(intent: Intent) = intent.action == Intent.ACTION_GET_CONTENT && intent.type != null
|
||||||
|
|
||||||
|
private fun isGetImageContentIntent(intent: Intent) = isGetContentIntent(intent) &&
|
||||||
|
(intent.type.startsWith("image/") || intent.type == MediaStore.Images.Media.CONTENT_TYPE)
|
||||||
|
|
||||||
|
private fun isGetVideoContentIntent(intent: Intent) = isGetContentIntent(intent) &&
|
||||||
|
(intent.type.startsWith("video/") || intent.type == MediaStore.Video.Media.CONTENT_TYPE)
|
||||||
|
|
||||||
|
private fun isGetAnyContentIntent(intent: Intent) = isGetContentIntent(intent) && intent.type == "*/*"
|
||||||
|
|
||||||
|
private fun isSetWallpaperIntent(intent: Intent?) = intent?.action == Intent.ACTION_SET_WALLPAPER
|
||||||
|
|
||||||
|
private fun hasImageContentData(intent: Intent) = intent.data == MediaStore.Images.Media.EXTERNAL_CONTENT_URI
|
||||||
|
|
||||||
|
private fun hasVideoContentData(intent: Intent) = intent.data == MediaStore.Video.Media.EXTERNAL_CONTENT_URI
|
||||||
|
|
||||||
|
private fun isImageType(intent: Intent) = (intent.type?.startsWith("image/") == true || intent.type == MediaStore.Images.Media.CONTENT_TYPE)
|
||||||
|
|
||||||
|
private fun isVideoType(intent: Intent) = (intent.type?.startsWith("video/") == true || intent.type == MediaStore.Video.Media.CONTENT_TYPE)
|
||||||
|
|
||||||
|
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
|
||||||
|
if (resultCode == Activity.RESULT_OK) {
|
||||||
|
if (requestCode == PICK_MEDIA && resultData != null) {
|
||||||
|
Intent().apply {
|
||||||
|
val path = resultData.data.path
|
||||||
|
val uri = Uri.fromFile(File(path))
|
||||||
|
if (mIsGetImageContentIntent || mIsGetVideoContentIntent || mIsGetAnyContentIntent) {
|
||||||
|
val type = Utils.getMimeType(path)
|
||||||
|
setDataAndTypeAndNormalize(uri, type)
|
||||||
|
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
|
||||||
|
} else if (mIsPickImageIntent || mIsPickVideoIntent) {
|
||||||
|
data = uri
|
||||||
|
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
|
||||||
|
}
|
||||||
|
|
||||||
|
setResult(Activity.RESULT_OK, this)
|
||||||
|
}
|
||||||
|
finish()
|
||||||
|
} else if (requestCode == PICK_WALLPAPER) {
|
||||||
|
setResult(Activity.RESULT_OK)
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
super.onActivityResult(requestCode, resultCode, resultData)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onItemClick(parent: AdapterView<*>, view: View, position: Int, id: Long) {
|
||||||
|
Intent(this, MediaActivity::class.java).apply {
|
||||||
|
putExtra(Constants.DIRECTORY, mDirs[position].path)
|
||||||
|
|
||||||
|
if (mIsSetWallpaperIntent) {
|
||||||
|
putExtra(Constants.SET_WALLPAPER_INTENT, true)
|
||||||
|
startActivityForResult(this, PICK_WALLPAPER)
|
||||||
|
} else {
|
||||||
|
putExtra(Constants.GET_IMAGE_INTENT, mIsPickImageIntent || mIsGetImageContentIntent)
|
||||||
|
putExtra(Constants.GET_VIDEO_INTENT, mIsPickVideoIntent || mIsGetVideoContentIntent)
|
||||||
|
putExtra(Constants.GET_ANY_INTENT, mIsGetAnyContentIntent)
|
||||||
|
startActivityForResult(this, PICK_MEDIA)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*override fun onItemCheckedStateChanged(mode: ActionMode, position: Int, id: Long, checked: Boolean) {
|
||||||
|
if (checked) {
|
||||||
|
mSelectedItemsCnt++
|
||||||
|
} else {
|
||||||
|
mSelectedItemsCnt--
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mSelectedItemsCnt > 0) {
|
||||||
|
mode.title = mSelectedItemsCnt.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
mode.invalidate()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
|
||||||
|
val inflater = mode.menuInflater
|
||||||
|
inflater.inflate(R.menu.cab_directories, menu)
|
||||||
|
mActionMode = mode
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean {
|
||||||
|
menu.findItem(R.id.cab_edit).isVisible = mSelectedItemsCnt == 1
|
||||||
|
|
||||||
|
var hiddenCnt = 0
|
||||||
|
var unhiddenCnt = 0
|
||||||
|
val items = directories_grid.checkedItemPositions
|
||||||
|
val cnt = items.size()
|
||||||
|
for (i in 0..cnt - 1) {
|
||||||
|
if (items.valueAt(i)) {
|
||||||
|
val id = items.keyAt(i)
|
||||||
|
if (mConfig.getIsFolderHidden(mDirs[id].path))
|
||||||
|
hiddenCnt++
|
||||||
|
else
|
||||||
|
unhiddenCnt++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
menu.findItem(R.id.cab_hide).isVisible = unhiddenCnt > 0
|
||||||
|
menu.findItem(R.id.cab_unhide).isVisible = hiddenCnt > 0
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
|
||||||
|
return when (item.itemId) {
|
||||||
|
R.id.cab_properties -> {
|
||||||
|
showProperties()
|
||||||
|
true
|
||||||
|
}
|
||||||
|
R.id.cab_edit -> {
|
||||||
|
editDirectory()
|
||||||
|
true
|
||||||
|
}
|
||||||
|
R.id.cab_delete -> {
|
||||||
|
prepareForDeleting()
|
||||||
|
mode.finish()
|
||||||
|
true
|
||||||
|
}
|
||||||
|
R.id.cab_hide -> {
|
||||||
|
hideFolders()
|
||||||
|
mode.finish()
|
||||||
|
true
|
||||||
|
}
|
||||||
|
R.id.cab_unhide -> {
|
||||||
|
unhideFolders()
|
||||||
|
mode.finish()
|
||||||
|
true
|
||||||
|
}
|
||||||
|
R.id.cab_copy_move -> {
|
||||||
|
displayCopyDialog()
|
||||||
|
true
|
||||||
|
}
|
||||||
|
else -> false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDestroyActionMode(mode: ActionMode) {
|
||||||
|
mSelectedItemsCnt = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onTouch(v: View, event: MotionEvent): Boolean {
|
||||||
|
if (mIsSnackbarShown) {
|
||||||
|
deleteDirs()
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}*/
|
||||||
|
|
||||||
|
private fun hideFolders() {
|
||||||
|
mConfig.addHiddenDirectories(selectedPaths)
|
||||||
|
getDirectories()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun unhideFolders() {
|
||||||
|
mConfig.removeHiddenDirectories(selectedPaths)
|
||||||
|
getDirectories()
|
||||||
|
}
|
||||||
|
|
||||||
|
private val selectedPaths: Set<String>
|
||||||
|
get() {
|
||||||
|
val items = directories_grid.checkedItemPositions
|
||||||
|
val selectedPaths = HashSet<String>()
|
||||||
|
val cnt = items.size()
|
||||||
|
for (i in 0..cnt - 1) {
|
||||||
|
if (items.valueAt(i)) {
|
||||||
|
val id = items.keyAt(i)
|
||||||
|
selectedPaths.add(mDirs[id].path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return selectedPaths
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun scanCompleted(path: String) {
|
||||||
|
val dir = File(path)
|
||||||
|
if (dir.isDirectory) {
|
||||||
|
getDirectories()
|
||||||
|
|
||||||
|
runOnUiThread { toast(R.string.rename_folder_ok) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onRefresh() {
|
||||||
|
getDirectories()
|
||||||
|
directories_holder.isRefreshing = false
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun gotDirectories(dirs: ArrayList<Directory>) {
|
||||||
|
mIsGettingDirs = false
|
||||||
|
if (dirs.toString() == mDirs.toString()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
mDirs = dirs
|
||||||
|
|
||||||
|
val adapter = DirectoryAdapter(this, mDirs)
|
||||||
|
directories_grid.apply {
|
||||||
|
this@apply.adapter = adapter
|
||||||
|
onItemClickListener = this@MainActivity
|
||||||
|
//setMultiChoiceModeListener(this)
|
||||||
|
//setOnTouchListener(this)
|
||||||
|
choiceMode = GridView.CHOICE_MODE_MULTIPLE_MODAL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -72,11 +72,10 @@ class RenameDirectoryDialog(val activity: SimpleActivity, val dir: File, val lis
|
||||||
}
|
}
|
||||||
|
|
||||||
updatedFiles.add(newDir.absolutePath)
|
updatedFiles.add(newDir.absolutePath)
|
||||||
val changedFiles = updatedFiles.toTypedArray()
|
listener.onRenameDirSuccess(updatedFiles)
|
||||||
listener.onRenameDirSuccess(changedFiles)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
interface OnRenameDirListener {
|
interface OnRenameDirListener {
|
||||||
fun onRenameDirSuccess(changedFiles: Array<String>)
|
fun onRenameDirSuccess(changedPaths: ArrayList<String>)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue