Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a QuickViewFragment and buttons for it #2680

Draft
wants to merge 7 commits into
base: release/3.7
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ android {
"room.expandProjection": "true"]
}
}

//For Dimezis/BlurView
renderscriptTargetApi 29 //must match target sdk and build tools
renderscriptSupportModeEnabled true
}

signingConfigs {
Expand Down Expand Up @@ -124,13 +128,16 @@ dependencies {

implementation 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
implementation 'androidx.legacy:legacy-support-v13:1.0.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation "com.google.android.material:material:$androidMaterialVersion"
implementation "androidx.fragment:fragment-ktx:$androidXFragmentVersion"
implementation "androidx.appcompat:appcompat:$androidXAppCompatVersion"
implementation 'androidx.palette:palette-ktx:1.0.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation "androidx.room:room-runtime:$roomVersion"
implementation "com.android.billingclient:billing:$androidBillingVersion"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$androidXLifecycleVersion"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$androidXLifecycleVersion"
kapt "androidx.room:room-compiler:$roomVersion"
// RxJava support for Room
implementation "androidx.room:room-rxjava2:$roomVersion"
Expand Down Expand Up @@ -250,6 +257,10 @@ dependencies {
implementation "androidx.core:core-ktx:$kotlin_version"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation "ch.acra:acra-core:5.7.0"

//For blurring quickview background
implementation 'com.eightbitlab:blurview:1.6.6'
implementation 'com.eightbitlab:supportrenderscriptblur:1.0.2'
}

configurations.all {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import java.util.ArrayList;
import java.util.List;

import com.amaze.filemanager.BuildConfig;
import com.amaze.filemanager.GlideApp;
import com.amaze.filemanager.R;
import com.amaze.filemanager.adapters.data.IconDataParcelable;
Expand All @@ -50,6 +51,7 @@
import com.amaze.filemanager.ui.drag.RecyclerAdapterDragListener;
import com.amaze.filemanager.ui.fragments.MainFragment;
import com.amaze.filemanager.ui.fragments.preference_fragments.PreferencesConstants;
import com.amaze.filemanager.ui.fragments.quickview.HasQuickView;
import com.amaze.filemanager.ui.icons.Icons;
import com.amaze.filemanager.ui.icons.MimeTypes;
import com.amaze.filemanager.ui.provider.UtilitiesProvider;
Expand Down Expand Up @@ -733,6 +735,12 @@ public void onBindViewHolder(final RecyclerView.ViewHolder vholder, int p) {
return true;
});

if (HasQuickView.hasQuickView(rowItem.filetype) && BuildConfig.DEBUG) {
holder.quickView.setVisibility(View.VISIBLE);
final View.OnClickListener listener = v -> mainFrag.onQuickViewClicked(rowItem);
holder.quickView.setOnClickListener(listener);
}

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
holder.checkImageView.setBackground(
new CircleGradientDrawable(
Expand Down Expand Up @@ -910,6 +918,11 @@ && getBoolean(PREFERENCE_SHOW_THUMB))) {
mainFrag.onListItemClicked(
isBackButton, vholder.getAdapterPosition(), rowItem, holder.checkImageViewGrid);
});
if (HasQuickView.hasQuickView(rowItem.filetype) && BuildConfig.DEBUG) {
holder.quickView.setVisibility(View.VISIBLE);
final View.OnClickListener listener = v -> mainFrag.onQuickViewClicked(rowItem);
holder.quickView.setOnClickListener(listener);
}
holder.txtTitle.setText(rowItem.title);
holder.imageView1.setVisibility(View.INVISIBLE);
holder.genericIcon.setVisibility(View.VISIBLE);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,16 @@

package com.amaze.filemanager.adapters.data;

import com.amaze.filemanager.GlideRequests;
import com.bumptech.glide.RequestBuilder;
import com.bumptech.glide.load.engine.DiskCacheStrategy;

import android.graphics.drawable.Drawable;
import android.os.Parcel;
import android.os.Parcelable;

import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;

/**
* Saves data on what should be loaded as an icon for LayoutElementParcelable
Expand Down Expand Up @@ -64,6 +70,22 @@ public void setImageBroken(boolean imageBroken) {
isImageBroken = imageBroken;
}

/**
* This is hack to load this icon to a request: The problem is that cloud icons cannot be cached.
*/
@NonNull
public RequestBuilder<Drawable> getPreloadRequestBuilder(@NonNull GlideRequests request) {
if (type == IconDataParcelable.IMAGE_FROMFILE) {
return request.load(path);
}

if (type == IconDataParcelable.IMAGE_FROMCLOUD) {
return request.load(path).diskCacheStrategy(DiskCacheStrategy.NONE);
}

return request.load(image);
}

@Override
public int describeContents() {
return 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@
import java.util.List;

import com.amaze.filemanager.GlideApp;
import com.amaze.filemanager.GlideRequest;
import com.amaze.filemanager.GlideRequests;
import com.amaze.filemanager.adapters.data.IconDataParcelable;
import com.bumptech.glide.ListPreloader;
import com.bumptech.glide.RequestBuilder;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestOptions;

import android.graphics.drawable.Drawable;

Expand All @@ -41,17 +41,18 @@ public class RecyclerPreloadModelProvider
implements ListPreloader.PreloadModelProvider<IconDataParcelable> {

private final List<IconDataParcelable> urisToLoad;
private final GlideRequest<Drawable> request;
private final GlideRequests requests;
private final RequestOptions cropOptions;

public RecyclerPreloadModelProvider(
@NonNull Fragment fragment, @NonNull List<IconDataParcelable> uris, boolean isCircled) {
urisToLoad = uris;
GlideRequest<Drawable> incompleteRequest = GlideApp.with(fragment).asDrawable();
requests = GlideApp.with(fragment);

if (isCircled) {
request = incompleteRequest.circleCrop();
cropOptions = new RequestOptions().circleCrop();
} else {
request = incompleteRequest.centerCrop();
cropOptions = new RequestOptions().centerCrop();
}
}

Expand All @@ -66,14 +67,6 @@ public List<IconDataParcelable> getPreloadItems(int position) {
@Override
@Nullable
public RequestBuilder<Drawable> getPreloadRequestBuilder(IconDataParcelable iconData) {
RequestBuilder<Drawable> requestBuilder;
if (iconData.type == IconDataParcelable.IMAGE_FROMFILE) {
requestBuilder = request.load(iconData.path);
} else if (iconData.type == IconDataParcelable.IMAGE_FROMCLOUD) {
requestBuilder = request.load(iconData.path).diskCacheStrategy(DiskCacheStrategy.NONE);
} else {
requestBuilder = request.load(iconData.image);
}
return requestBuilder;
return iconData.getPreloadRequestBuilder(requests).apply(cropOptions);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@ class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
@JvmField
val about: ImageButton = view.findViewById(R.id.properties)

@JvmField
val quickView: ImageButton = view.findViewById(R.id.quickView)

@JvmField
val checkImageView: ImageView? = view.findViewById(R.id.check_icon)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@
import com.amaze.filemanager.ui.fragments.SearchWorkerFragment;
import com.amaze.filemanager.ui.fragments.TabFragment;
import com.amaze.filemanager.ui.fragments.preference_fragments.PreferencesConstants;
import com.amaze.filemanager.ui.fragments.quickview.QuickViewFragment;
import com.amaze.filemanager.ui.strings.StorageNamingHelper;
import com.amaze.filemanager.ui.views.CustomZoomFocusChange;
import com.amaze.filemanager.ui.views.appbar.AppBar;
Expand Down Expand Up @@ -203,6 +204,7 @@ public class MainActivity extends PermissionsActivity

public static final Pattern DIR_SEPARATOR = Pattern.compile("/");
public static final String TAG_ASYNC_HELPER = "async_helper";
public static final String TAG_QUICK_VIEW_FRAGMENT = "quick_view_fragment";

private DataUtils dataUtils;

Expand Down Expand Up @@ -829,6 +831,14 @@ public synchronized ArrayList<StorageDirectoryParcelable> getStorageDirectoriesL

@Override
public void onBackPressed() {
Fragment quickViewFragment =
getSupportFragmentManager().findFragmentById(R.id.quickViewContainer);

if (quickViewFragment != null) {
((QuickViewFragment) quickViewFragment).onBackPressed();
return;
}

if (!drawer.isLocked() && drawer.isOpen()) {
drawer.close();
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import com.afollestad.materialdialogs.MaterialDialog;
import com.amaze.filemanager.R;
import com.amaze.filemanager.adapters.RecyclerAdapter;
import com.amaze.filemanager.adapters.data.IconDataParcelable;
import com.amaze.filemanager.adapters.data.LayoutElementParcelable;
import com.amaze.filemanager.adapters.holders.ItemViewHolder;
import com.amaze.filemanager.application.AppConfig;
Expand Down Expand Up @@ -67,6 +68,9 @@
import com.amaze.filemanager.ui.drag.RecyclerAdapterDragListener;
import com.amaze.filemanager.ui.drag.TabFragmentBottomDragListener;
import com.amaze.filemanager.ui.fragments.data.MainFragmentViewModel;
import com.amaze.filemanager.ui.fragments.quickview.QuickViewFragment;
import com.amaze.filemanager.ui.fragments.quickview.types.QuickViewImage;
import com.amaze.filemanager.ui.fragments.quickview.types.QuickViewType;
import com.amaze.filemanager.ui.icons.MimeTypes;
import com.amaze.filemanager.ui.provider.UtilitiesProvider;
import com.amaze.filemanager.ui.selection.SelectionPopupMenu;
Expand Down Expand Up @@ -558,6 +562,8 @@ public boolean onPrepareActionMode(ActionMode mode, Menu menu) {

// called when the user selects a contextual menu item
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
assureNoQuickView();

computeScroll();
ArrayList<LayoutElementParcelable> checkedItems = adapter.getCheckedItems();
switch (item.getItemId()) {
Expand Down Expand Up @@ -736,6 +742,28 @@ public void onDestroyActionMode(ActionMode mode) {
}
};

/** When TabFragment detects this fragment is in view it calls this method */
public void onWorkspaceSelected() {
if (getCurrentPath() != null) {
getMainActivity().getDrawer().selectCorrectDrawerItemForPath(getCurrentPath());
}

final QuickViewFragment quickViewFragment = getCurrentQuickView();

if (quickViewFragment != null) {
quickViewFragment.runOpenVisibilityChanges();
}
}

/** When TabFragment detects this fragment is not in view it calls this method */
public void onWorkspaceUnselected() {
final QuickViewFragment quickViewFragment = getCurrentQuickView();

if (quickViewFragment != null) {
quickViewFragment.runExitVisibilityChanges();
}
}

private BroadcastReceiver receiver2 =
new BroadcastReceiver() {

Expand Down Expand Up @@ -908,6 +936,33 @@ public void onListItemClicked(
}
}

public void onQuickViewClicked(LayoutElementParcelable layoutElementParcelable) {
final IconDataParcelable iconData = layoutElementParcelable.iconData;

final QuickViewType quickViewType = new QuickViewImage(iconData, layoutElementParcelable.title);
final QuickViewFragment fragment = QuickViewFragment.newInstance(quickViewType);

getChildFragmentManager()
.beginTransaction()
.replace(R.id.quickViewContainer, fragment, MainActivity.TAG_QUICK_VIEW_FRAGMENT)
.commit();
}

private void assureNoQuickView() {
QuickViewFragment fragment = getCurrentQuickView();

if (fragment == null) {
return;
}

fragment.exit();
}

@Nullable
private QuickViewFragment getCurrentQuickView() {
return (QuickViewFragment) getChildFragmentManager().findFragmentById(R.id.quickViewContainer);
}

public void updateTabWithDb(Tab tab) {
mainFragmentViewModel.setCurrentPath(tab.path);
mainFragmentViewModel.setHome(tab.home);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@
/** Created by Arpit on 15-12-2014. */
public class TabFragment extends Fragment implements ViewPager.OnPageChangeListener {

public List<Fragment> fragments = new ArrayList<>();
public List<Fragment> fragments = new ArrayList<>(2);
public ScreenSlidePagerAdapter mSectionsPagerAdapter;
public DisablableViewPager mViewPager;

Expand Down Expand Up @@ -265,7 +265,7 @@ public void onPageScrolled(int position, float positionOffset, int positionOffse
}

@Override
public void onPageSelected(int p1) {
public void onPageSelected(int selectedTabId) {
mainActivity
.getAppbar()
.getAppbarLayout()
Expand All @@ -274,7 +274,7 @@ public void onPageSelected(int p1) {
.setInterpolator(new DecelerateInterpolator(2))
.start();

MainActivity.currentTab = p1;
MainActivity.currentTab = selectedTabId;

if (sharedPrefs != null) {
sharedPrefs
Expand All @@ -283,19 +283,25 @@ public void onPageSelected(int p1) {
.apply();
}

// Log.d(getClass().getSimpleName(), "Page Selected: " + MainActivity.currentTab, new
// Exception());
Fragment notInView = fragments.get(selectedTabId == 0 ? 1 : 0);
if (notInView instanceof MainFragment) {
((MainFragment) notInView).onWorkspaceUnselected();
}

Fragment inView = fragments.get(selectedTabId);
if (inView instanceof MainFragment) {
MainFragment mainFragment = (MainFragment) inView;

Fragment fragment = fragments.get(p1);
if (fragment != null && fragment instanceof MainFragment) {
MainFragment ma = (MainFragment) fragment;
if (ma.getCurrentPath() != null) {
mainActivity.getDrawer().selectCorrectDrawerItemForPath(ma.getCurrentPath());
updateBottomBar(ma);
if (mainFragment.getCurrentPath() != null) {
updateBottomBar(mainFragment);
}

((MainFragment) inView).onWorkspaceSelected();
}

if (circleDrawable1 != null && circleDrawable2 != null) updateIndicator(p1);
if (circleDrawable1 != null && circleDrawable2 != null) {
updateIndicator(selectedTabId);
}
}

@Override
Expand Down
Loading