From 89e7195caa5cd7528626f0690338b7e786201b95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B6=82=20=E5=AE=B6=20=E6=B5=A9?= <35959817+Jahhow@users.noreply.github.com> Date: Sat, 11 Apr 2020 12:06:34 +0800 Subject: [PATCH] Don't show 'Done' after creating new folder; AlbumActivity properly deals with ItemActivity's delete/move/copy broadcast --- .../adapter/album/AlbumAdapter.java | 2 +- .../data/fileOperations/FileOperation.java | 15 ++- .../data/fileOperations/NewDirectory.java | 5 + .../cameraroll/data/models/VirtualAlbum.java | 16 +-- .../koller/cameraroll/ui/AlbumActivity.java | 36 ++++--- .../ui/FileOperationDialogActivity.java | 101 +++++------------- .../us/koller/cameraroll/ui/ItemActivity.java | 48 ++++----- .../util/ScrollIndicatorAdaptor.java | 28 +++++ .../main/res/layout/file_operation_dialog.xml | 6 +- 9 files changed, 107 insertions(+), 150 deletions(-) create mode 100644 app/src/main/java/us/koller/cameraroll/util/ScrollIndicatorAdaptor.java diff --git a/app/src/main/java/us/koller/cameraroll/adapter/album/AlbumAdapter.java b/app/src/main/java/us/koller/cameraroll/adapter/album/AlbumAdapter.java index 45321c73..4e874860 100644 --- a/app/src/main/java/us/koller/cameraroll/adapter/album/AlbumAdapter.java +++ b/app/src/main/java/us/koller/cameraroll/adapter/album/AlbumAdapter.java @@ -65,7 +65,7 @@ public AlbumAdapter(SelectorModeManager.Callback callback, final RecyclerView re @Override public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, int fromX, int fromY, int toX, int toY) { if (oldHolder != newHolder) - Log.w(TAG, "animateChange"); + //Log.w(TAG, "animateChange"); return super.animateChange(oldHolder, newHolder, fromX, fromY, toX, toY); } });*/ diff --git a/app/src/main/java/us/koller/cameraroll/data/fileOperations/FileOperation.java b/app/src/main/java/us/koller/cameraroll/data/fileOperations/FileOperation.java index 4ce25037..badabd12 100644 --- a/app/src/main/java/us/koller/cameraroll/data/fileOperations/FileOperation.java +++ b/app/src/main/java/us/koller/cameraroll/data/fileOperations/FileOperation.java @@ -169,8 +169,12 @@ public boolean autoSendDoneBroadcast() { } public void sendDoneBroadcast() { + sendDoneBroadcast(true); + } + + public void sendDoneBroadcast(boolean showToastDone) { ContentObserver.selfChange = false; - showToast(getString(R.string.done)); + if (showToastDone) showToast(getString(R.string.done)); Intent intent = getDoneIntent(); sendLocalBroadcast(intent); } @@ -222,12 +226,7 @@ public void onProgress(final int progress, final int totalNumber) { } public void showToast(final String message) { - runOnUiThread(new Runnable() { - @Override - public void run() { - Toast.makeText(getBaseContext(), message, Toast.LENGTH_SHORT).show(); - } - }); + runOnUiThread(() -> Toast.makeText(getBaseContext(), message, Toast.LENGTH_SHORT).show()); } public void runOnUiThread(Runnable r) { @@ -417,7 +416,7 @@ public static void scanPathsWithNotification(final Context context, final String @SuppressLint("ShowToast") private static void scanPaths(final Context context, final String[] paths, final MediaScannerCallback callback, final boolean withNotification) { - //Log.i("FileOperation", "scanPaths(), paths: " + Arrays.toString(paths)); + //Log.i("FileOperation", "scanPaths(), paths: " + Arrays.toString(paths)); if (paths == null) { if (callback != null) { callback.onAllPathsScanned(); diff --git a/app/src/main/java/us/koller/cameraroll/data/fileOperations/NewDirectory.java b/app/src/main/java/us/koller/cameraroll/data/fileOperations/NewDirectory.java index 5322b059..d95e74a1 100644 --- a/app/src/main/java/us/koller/cameraroll/data/fileOperations/NewDirectory.java +++ b/app/src/main/java/us/koller/cameraroll/data/fileOperations/NewDirectory.java @@ -64,6 +64,11 @@ public int getType() { return FileOperation.NEW_DIR; } + @Override + public void sendDoneBroadcast() { + sendDoneBroadcast(false); + } + private static boolean createNewFolder(String newFolderPath) { File dir = new File(newFolderPath); return !dir.exists() && dir.mkdirs(); diff --git a/app/src/main/java/us/koller/cameraroll/data/models/VirtualAlbum.java b/app/src/main/java/us/koller/cameraroll/data/models/VirtualAlbum.java index 4eb46ff1..3f13abce 100644 --- a/app/src/main/java/us/koller/cameraroll/data/models/VirtualAlbum.java +++ b/app/src/main/java/us/koller/cameraroll/data/models/VirtualAlbum.java @@ -29,6 +29,7 @@ import us.koller.cameraroll.data.Settings; import us.koller.cameraroll.data.provider.Provider; import us.koller.cameraroll.themes.Theme; +import us.koller.cameraroll.util.ScrollIndicatorAdaptor; import us.koller.cameraroll.util.SortUtil; public class VirtualAlbum extends Album { @@ -265,20 +266,7 @@ public void onVirtualAlbumSelected(VirtualAlbum virtualAlbum) { final View scrollIndicatorTop = dialogLayout.findViewById(R.id.scroll_indicator_top); final View scrollIndicatorBottom = dialogLayout.findViewById(R.id.scroll_indicator_bottom); - recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { - @Override - public void onScrolled(RecyclerView recyclerView, int dx, int dy) { - super.onScrolled(recyclerView, dx, dy); - scrollIndicatorTop.setVisibility( - recyclerView.canScrollVertically(-1) ? - View.VISIBLE : View.INVISIBLE); - - scrollIndicatorBottom.setVisibility( - recyclerView.canScrollVertically(1) ? - View.VISIBLE : View.INVISIBLE); - } - }); - + new ScrollIndicatorAdaptor(recyclerView, scrollIndicatorTop, scrollIndicatorBottom); return dialog; } diff --git a/app/src/main/java/us/koller/cameraroll/ui/AlbumActivity.java b/app/src/main/java/us/koller/cameraroll/ui/AlbumActivity.java index eff22aa6..336b044e 100644 --- a/app/src/main/java/us/koller/cameraroll/ui/AlbumActivity.java +++ b/app/src/main/java/us/koller/cameraroll/ui/AlbumActivity.java @@ -915,7 +915,7 @@ public void deleteSelectedItems() { public void onClick(DialogInterface dialogInterface, int i) { deleteAlbumItemsSnackbar(selected_items); } - }).create().show(); + }).show(); } public void fabClicked() { @@ -1179,24 +1179,26 @@ public void onAlbumLoaded(Album album) { } private void removeAlbumItem(String path) { - //Log.d("AlbumActivity", "removeAlbumItem() called with: path = [" + path + "]"); - int index = -1; - ArrayList items = album.getAlbumItems(); - for (int i = 0; i < items.size(); i++) { - AlbumItem albumItem = items.get(i); - if (albumItem.getPath().equals(path)) { - index = i; - break; + //Log.d(TAG, "removeAlbumItem(" + path + ")"); + ArrayList albumItems = album.getAlbumItems(); + int size = albumItems.size(); + for (int i = 0; i < size; ++i) { + String curPath = albumItems.get(i).getPath(); + if (curPath.equals(path)) { + albumItems.remove(i); + if (size == 1) + supportFinishAfterTransition(); + else + recyclerViewAdapter.notifyItemRemoved(i); + return; } } - if (items.size() == 0) { - supportFinishAfterTransition(); - return; - } - if (index > -1) { - items.remove(index); - recyclerViewAdapter.notifyItemRemoved(index); - } + //todo: property 'album' is shared with ItemActivity. This can cause problems. + //Log.w(TAG, "todo: property 'album' is shared with ItemActivity. This can cause problems."); + if (size == 0) + supportFinishAfterTransition(); + else + recyclerViewAdapter.notifyDataSetChanged(); } } diff --git a/app/src/main/java/us/koller/cameraroll/ui/FileOperationDialogActivity.java b/app/src/main/java/us/koller/cameraroll/ui/FileOperationDialogActivity.java index d003aa36..135a42e7 100644 --- a/app/src/main/java/us/koller/cameraroll/ui/FileOperationDialogActivity.java +++ b/app/src/main/java/us/koller/cameraroll/ui/FileOperationDialogActivity.java @@ -40,9 +40,11 @@ import us.koller.cameraroll.data.provider.MediaProvider; import us.koller.cameraroll.ui.widget.GridMarginDecoration; import us.koller.cameraroll.util.MediaType; +import us.koller.cameraroll.util.ScrollIndicatorAdaptor; import us.koller.cameraroll.util.Util; public class FileOperationDialogActivity extends ThemeableActivity { + protected static final String TAG = FileOperationDialogActivity.class.getSimpleName(); public static String ACTION_COPY = "ACTION_COPY"; public static String ACTION_MOVE = "ACTION_MOVE"; @@ -96,14 +98,8 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { showFolderSelectorDialog(files); } - private interface NewFolderCallback { - void newFolderCreated(String path); - - void failed(); - } - @Override - protected void onSaveInstanceState(Bundle outState) { + protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); if (creatingNewFolder) { @@ -133,33 +129,18 @@ protected void onDestroy() { public void showFolderSelectorDialog(final File_POJO[] files) { View v = LayoutInflater.from(this) - .inflate(R.layout.file_operation_dialog, - (ViewGroup) findViewById(R.id.root_view), - false); + .inflate(R.layout.file_operation_dialog, findViewById(R.id.root_view), false); + + final RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(); RecyclerView recyclerView = v.findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new GridLayoutManager(this, 2)); recyclerView.addItemDecoration(new GridMarginDecoration((int) getResources().getDimension(R.dimen.album_grid_spacing))); - - final RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(); recyclerView.setAdapter(recyclerViewAdapter); final View scrollIndicatorTop = v.findViewById(R.id.scroll_indicator_top); final View scrollIndicatorBottom = v.findViewById(R.id.scroll_indicator_bottom); - - recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { - @Override - public void onScrolled(RecyclerView recyclerView, int dx, int dy) { - super.onScrolled(recyclerView, dx, dy); - scrollIndicatorTop.setVisibility( - recyclerView.canScrollVertically(-1) ? - View.VISIBLE : View.INVISIBLE); - - scrollIndicatorBottom.setVisibility( - recyclerView.canScrollVertically(1) ? - View.VISIBLE : View.INVISIBLE); - } - }); + new ScrollIndicatorAdaptor(recyclerView, scrollIndicatorTop, scrollIndicatorBottom); int stringRes; boolean oneItem = files.length == 1; @@ -216,23 +197,8 @@ public void onDismiss(DialogInterface dialogInterface) { } public void createNewFolder(final File_POJO[] files) { - createNewFolderDialog(new NewFolderCallback() { - @Override - public void newFolderCreated(String path) { - executeAction(files, path); - } - - @Override - public void failed() { - setResult(RESULT_CANCELED, null); - finish(); - } - }); - } - - public void createNewFolderDialog(final NewFolderCallback callback) { - View dialogLayout = LayoutInflater.from(this).inflate(R.layout.input_dialog_layout, - (ViewGroup) findViewById(R.id.root_view), false); + View dialogLayout = LayoutInflater.from(this) + .inflate(R.layout.input_dialog_layout, findViewById(R.id.root_view), false); final EditText editText = dialogLayout.findViewById(R.id.edit_text); @@ -255,12 +221,9 @@ public void onReceive(Context context, Intent intent) { unregisterLocalBroadcastReceiver(this); switch (intent.getAction()) { case FileOperation.RESULT_DONE: - creatingNewFolder = false; - callback.newFolderCreated(newFolder.getPath()); - break; case FileOperation.FAILED: creatingNewFolder = false; - callback.failed(); + executeAction(files, newFolder.getPath()); break; default: break; @@ -295,6 +258,7 @@ public void onDismiss(DialogInterface dialogInterface) { } public void executeAction(File_POJO[] files, String target) { + //Log.i(TAG, "executeAction " + action); int action = this.action.equals(ACTION_COPY) ? FileOperation.COPY : FileOperation.MOVE; final Intent workIntent = FileOperation.getDefaultIntent(this, action, files); workIntent.putExtra(FileOperation.TARGET, new File_POJO(target, false)); @@ -304,12 +268,8 @@ public void executeAction(File_POJO[] files, String target) { @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); - switch (requestCode) { - case MainActivity.REMOVABLE_STORAGE_PERMISSION_REQUEST_CODE: - onDialogDismiss(); - break; - default: - break; + if (requestCode == MainActivity.REMOVABLE_STORAGE_PERMISSION_REQUEST_CODE) { + onDialogDismiss(); } } @@ -336,7 +296,7 @@ private static class RecyclerViewAdapter extends RecyclerView.Adapter { static class ViewHolder extends RecyclerView.ViewHolder { - public ViewHolder(View itemView) { + ViewHolder(View itemView) { super(itemView); } @@ -355,30 +315,19 @@ private void setSelected(boolean selected) { colorDrawable2 = new ColorDrawable(tintColor); colorDrawable1.setAlpha(138); colorDrawable2.setAlpha(138); - card.post(new Runnable() { - @Override - public void run() { - card.getOverlay().clear(); - if (selectorOverlay != null) { - int width = card.getWidth(), height = card.getHeight(); - int start = (width - height) / 2; - //noinspection SuspiciousNameCombination - selectorOverlay.setBounds(start, 0, start + height, height); - colorDrawable1.setBounds(0, 0, start, height); - colorDrawable2.setBounds(start + height, 0, width, height); - card.getOverlay().add(selectorOverlay); - card.getOverlay().add(colorDrawable1); - card.getOverlay().add(colorDrawable2); - } - } + card.post(() -> { + card.getOverlay().clear(); + int width = card.getWidth(), height = card.getHeight(); + int start = (width - height) / 2; + selectorOverlay.setBounds(start, 0, start + height, height); + colorDrawable1.setBounds(0, 0, start, height); + colorDrawable2.setBounds(start + height, 0, width, height); + card.getOverlay().add(selectorOverlay); + card.getOverlay().add(colorDrawable1); + card.getOverlay().add(colorDrawable2); }); } else { - card.post(new Runnable() { - @Override - public void run() { - card.getOverlay().clear(); - } - }); + card.post(() -> card.getOverlay().clear()); } } } diff --git a/app/src/main/java/us/koller/cameraroll/ui/ItemActivity.java b/app/src/main/java/us/koller/cameraroll/ui/ItemActivity.java index 0ca93de2..0624f933 100644 --- a/app/src/main/java/us/koller/cameraroll/ui/ItemActivity.java +++ b/app/src/main/java/us/koller/cameraroll/ui/ItemActivity.java @@ -61,6 +61,7 @@ import us.koller.cameraroll.interpolator.MyInterpolator; import us.koller.cameraroll.util.MediaType; import us.koller.cameraroll.util.ParallaxTransformer; +import us.koller.cameraroll.util.ScrollIndicatorAdaptor; import us.koller.cameraroll.util.Util; import us.koller.cameraroll.util.animators.ColorFade; @@ -83,6 +84,7 @@ public class ItemActivity extends ThemeableActivity { private Toolbar toolbar; private View bottomBar; + @Nullable private ViewPager viewPager; private AlertDialog infoDialog; @@ -232,7 +234,7 @@ private void onAlbumLoaded(Bundle savedInstanceState) { viewPager = findViewById(R.id.view_pager); viewPager.setAdapter(new ItemAdapter(album)); int currentItem = album.getAlbumItems().indexOf(albumItem); - viewPager.setCurrentItem(currentItem >= 0 ? currentItem : 0, false); + viewPager.setCurrentItem(currentItem < 0 ? 0 : currentItem, false); if (showAnimations()) { viewPager.setPageTransformer(false, new ParallaxTransformer()); } @@ -644,34 +646,18 @@ public void onClick(DialogInterface dialogInterface, int i) { new InfoRecyclerViewAdapter.OnDataRetrievedCallback() { @Override public void onDataRetrieved() { - ItemActivity.this.runOnUiThread(new Runnable() { - @Override - public void run() { - RecyclerView recyclerView = rootView.findViewById(R.id.recyclerView); - LinearLayoutManager layoutManager = new LinearLayoutManager(ItemActivity.this); - recyclerView.setLayoutManager(layoutManager); - recyclerView.setAdapter(adapter); - - final View scrollIndicatorTop = rootView.findViewById(R.id.scroll_indicator_top); - final View scrollIndicatorBottom = rootView.findViewById(R.id.scroll_indicator_bottom); - - recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { - @Override - public void onScrolled(RecyclerView recyclerView, int dx, int dy) { - super.onScrolled(recyclerView, dx, dy); - scrollIndicatorTop.setVisibility( - recyclerView.canScrollVertically(-1) ? - View.VISIBLE : View.INVISIBLE); - - scrollIndicatorBottom.setVisibility( - recyclerView.canScrollVertically(1) ? - View.VISIBLE : View.INVISIBLE); - } - }); - - loadingBar.setVisibility(View.GONE); - dialogLayout.setVisibility(View.VISIBLE); - } + ItemActivity.this.runOnUiThread(() -> { + RecyclerView recyclerView = rootView.findViewById(R.id.recyclerView); + LinearLayoutManager layoutManager = new LinearLayoutManager(ItemActivity.this); + recyclerView.setLayoutManager(layoutManager); + recyclerView.setAdapter(adapter); + + final View scrollIndicatorTop = rootView.findViewById(R.id.scroll_indicator_top); + final View scrollIndicatorBottom = rootView.findViewById(R.id.scroll_indicator_bottom); + new ScrollIndicatorAdaptor(recyclerView, scrollIndicatorTop, scrollIndicatorBottom); + + loadingBar.setVisibility(View.GONE); + dialogLayout.setVisibility(View.VISIBLE); }); } @@ -807,7 +793,9 @@ public void setResultAndFinish() { Intent data = new Intent(); data.setAction(SHARED_ELEMENT_RETURN_TRANSITION); data.putExtra(AlbumActivity.ALBUM_PATH, album.getPath()); - data.putExtra(AlbumActivity.EXTRA_CURRENT_ALBUM_POSITION, viewPager.getCurrentItem()); + if (viewPager != null) { + data.putExtra(AlbumActivity.EXTRA_CURRENT_ALBUM_POSITION, viewPager.getCurrentItem()); + } setResult(RESULT_OK, data); finish(); //overridePendingTransition(0,0); diff --git a/app/src/main/java/us/koller/cameraroll/util/ScrollIndicatorAdaptor.java b/app/src/main/java/us/koller/cameraroll/util/ScrollIndicatorAdaptor.java new file mode 100644 index 00000000..25b60ad5 --- /dev/null +++ b/app/src/main/java/us/koller/cameraroll/util/ScrollIndicatorAdaptor.java @@ -0,0 +1,28 @@ +package us.koller.cameraroll.util; + +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +public class ScrollIndicatorAdaptor extends RecyclerView.OnScrollListener { + private final View scrollIndicatorTop; + private final View scrollIndicatorBottom; + + public ScrollIndicatorAdaptor(RecyclerView recyclerView, View scrollIndicatorTop, View scrollIndicatorBottom) { + this.scrollIndicatorTop = scrollIndicatorTop; + this.scrollIndicatorBottom = scrollIndicatorBottom; + recyclerView.addOnScrollListener(this); + } + + @Override + public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { + scrollIndicatorTop.setVisibility( + recyclerView.canScrollVertically(-1) ? + View.VISIBLE : View.INVISIBLE); + + scrollIndicatorBottom.setVisibility( + recyclerView.canScrollVertically(1) ? + View.VISIBLE : View.INVISIBLE); + } +} diff --git a/app/src/main/res/layout/file_operation_dialog.xml b/app/src/main/res/layout/file_operation_dialog.xml index 9197def1..249157df 100644 --- a/app/src/main/res/layout/file_operation_dialog.xml +++ b/app/src/main/res/layout/file_operation_dialog.xml @@ -5,9 +5,8 @@ android:orientation="vertical" android:paddingTop="20dp"> - @@ -20,9 +19,8 @@ android:paddingEnd="@dimen/album_grid_spacing" android:paddingStart="@dimen/album_grid_spacing" /> -