From 254ac96795baff40b9d9417349bba0aa977e8e98 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Mon, 30 Apr 2018 18:41:16 +0200 Subject: [PATCH 01/27] WiP for #2485 --- drawable_resources/ic_star.svg | 1 + drawable_resources/ic_star_outline.svg | 1 + drawable_resources/ic_tag.svg | 1 + .../ui/adapter/FileDetailTabAdapter.java | 62 ++++++ .../FileDetailActivitiesFragment.java | 76 +++++++ .../ui/fragment/FileDetailFragment.java | 84 +++++--- .../fragment/FileDetailSharingFragment.java | 175 +++++++++++++++++ src/main/res/drawable/ic_star.xml | 8 + src/main/res/drawable/ic_star_outline.xml | 8 + src/main/res/drawable/ic_tag.xml | 8 + .../file_details_activities_fragment.xml | 53 +++++ src/main/res/layout/file_details_fragment.xml | 185 +++++++++--------- .../layout/file_details_sharing_fragment.xml | 105 ++++++++++ src/main/res/values/strings.xml | 1 + 14 files changed, 651 insertions(+), 117 deletions(-) create mode 100644 drawable_resources/ic_star.svg create mode 100644 drawable_resources/ic_star_outline.svg create mode 100644 drawable_resources/ic_tag.svg create mode 100644 src/main/java/com/owncloud/android/ui/adapter/FileDetailTabAdapter.java create mode 100644 src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java create mode 100644 src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java create mode 100644 src/main/res/drawable/ic_star.xml create mode 100644 src/main/res/drawable/ic_star_outline.xml create mode 100644 src/main/res/drawable/ic_tag.xml create mode 100644 src/main/res/layout/file_details_activities_fragment.xml create mode 100644 src/main/res/layout/file_details_sharing_fragment.xml diff --git a/drawable_resources/ic_star.svg b/drawable_resources/ic_star.svg new file mode 100644 index 000000000000..92c32ed1c617 --- /dev/null +++ b/drawable_resources/ic_star.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/drawable_resources/ic_star_outline.svg b/drawable_resources/ic_star_outline.svg new file mode 100644 index 000000000000..715b6588058b --- /dev/null +++ b/drawable_resources/ic_star_outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/drawable_resources/ic_tag.svg b/drawable_resources/ic_tag.svg new file mode 100644 index 000000000000..61c7eef9563f --- /dev/null +++ b/drawable_resources/ic_tag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/main/java/com/owncloud/android/ui/adapter/FileDetailTabAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/FileDetailTabAdapter.java new file mode 100644 index 000000000000..8b71890d99e3 --- /dev/null +++ b/src/main/java/com/owncloud/android/ui/adapter/FileDetailTabAdapter.java @@ -0,0 +1,62 @@ +/* + * Nextcloud Android client application + * + * @author Andy Scherzinger + * Copyright (C) 2018 Andy Scherzinger + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this program. If not, see . + */ + +package com.owncloud.android.ui.adapter; + +import android.accounts.Account; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentStatePagerAdapter; + +import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.ui.fragment.FileDetailActivitiesFragment; +import com.owncloud.android.ui.fragment.FileDetailSharingFragment; + +/** + * File details pager adapter. + */ +public class FileDetailTabAdapter extends FragmentStatePagerAdapter { + private OCFile file; + private Account account; + + public FileDetailTabAdapter(FragmentManager fm, OCFile file, Account account) { + super(fm); + + this.file = file; + this.account = account; + } + + @Override + public Fragment getItem(int position) { + switch (position) { + case 0: + return FileDetailActivitiesFragment.newInstance(file, account); + case 1: + return FileDetailSharingFragment.newInstance(file, account); + default: + return null; + } + } + + @Override + public int getCount() { + return 2; + } +} diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java new file mode 100644 index 000000000000..dde110dff5a9 --- /dev/null +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java @@ -0,0 +1,76 @@ +/* + * Nextcloud Android client application + * + * @author Andy Scherzinger + * Copyright (C) 2018 Andy Scherzinger + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this program. If not, see . + */ + +package com.owncloud.android.ui.fragment; + +import android.accounts.Account; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.owncloud.android.R; +import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.ui.activity.FileActivity; + +public class FileDetailActivitiesFragment extends Fragment { + + private static final String ARG_FILE = "FILE"; + private static final String ARG_ACCOUNT = "ACCOUNT"; + + private OCFile file; + private Account account; + + public static FileDetailActivitiesFragment newInstance(OCFile file, Account account) { + FileDetailActivitiesFragment fragment = new FileDetailActivitiesFragment(); + Bundle args = new Bundle(); + args.putParcelable(ARG_FILE, file); + args.putParcelable(ARG_ACCOUNT, account); + fragment.setArguments(args); + return fragment; + } + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, + ViewGroup container, + Bundle savedInstanceState) { + + file = getArguments().getParcelable(ARG_FILE); + account = getArguments().getParcelable(ARG_ACCOUNT); + + if (savedInstanceState != null) { + file = savedInstanceState.getParcelable(FileActivity.EXTRA_FILE); + account = savedInstanceState.getParcelable(FileActivity.EXTRA_ACCOUNT); + } + + View view = inflater.inflate(R.layout.file_details_activities_fragment, container, false); + + setupView(view); + + return view; + } + + private void setupView(View view) { + // TODO populate activities list + } +} diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index 168938d175e8..666905e8b5ed 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -25,6 +25,8 @@ import android.graphics.Bitmap; import android.os.Bundle; import android.support.design.widget.Snackbar; +import android.support.design.widget.TabLayout; +import android.support.v4.view.ViewPager; import android.support.v7.widget.SwitchCompat; import android.view.LayoutInflater; import android.view.Menu; @@ -53,6 +55,7 @@ import com.owncloud.android.lib.resources.shares.OCShare; import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.activity.FileDisplayActivity; +import com.owncloud.android.ui.adapter.FileDetailTabAdapter; import com.owncloud.android.ui.adapter.UserListAdapter; import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment; import com.owncloud.android.ui.dialog.RenameFileDialogFragment; @@ -68,8 +71,7 @@ /** * This Fragment is used to display the details about a file. */ -public class FileDetailFragment extends FileFragment implements OnClickListener, - CompoundButton.OnCheckedChangeListener { +public class FileDetailFragment extends FileFragment implements OnClickListener { private int mLayout; private View mView; @@ -154,13 +156,11 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, if (mLayout == R.layout.file_details_fragment) { int accentColor = ThemeUtils.primaryAccentColor(getContext()); - SwitchCompat favoriteToggle = mView.findViewById(R.id.fdFavorite); - favoriteToggle.setOnCheckedChangeListener(this); - ThemeUtils.tintSwitch(favoriteToggle, accentColor, false); ProgressBar progressBar = mView.findViewById(R.id.fdProgressBar); ThemeUtils.colorHorizontalProgressBar(progressBar, ThemeUtils.primaryAccentColor(getContext())); mProgressListener = new ProgressListener(progressBar); mView.findViewById(R.id.fdCancelBtn).setOnClickListener(this); + mView.findViewById(R.id.fdFavorite).setOnClickListener(this); ((TextView)mView.findViewById(R.id.fdShareTitle)).setTextColor(accentColor); ((TextView)mView.findViewById(R.id.fdShareWithUsersTitle)).setTextColor(accentColor); } @@ -169,6 +169,38 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, return mView; } + private void setupViewPager(View view) { + TabLayout tabLayout = view.findViewById(R.id.tab_layout); + tabLayout.removeAllTabs(); + + tabLayout.addTab(tabLayout.newTab().setText(R.string.drawer_item_activities)); + tabLayout.addTab(tabLayout.newTab().setText(R.string.share_dialog_title)); + + tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); + + final ViewPager viewPager = view.findViewById(R.id.pager); + final FileDetailTabAdapter adapter = new FileDetailTabAdapter + (getFragmentManager(), getFile(),mAccount); + viewPager.setAdapter(adapter); + viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); + tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + viewPager.setCurrentItem(tab.getPosition()); + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + + } + }); + } + @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); @@ -359,18 +391,26 @@ public void onClick(View v) { ((FileDisplayActivity) mContainerActivity).cancelTransference(getFile()); break; } + case R.id.fdFavorite: { + if (getFile().isAvailableOffline()) { + ((ImageView)getView().findViewById(R.id.fdFavorite)). + setImageDrawable(getResources() + .getDrawable(R.drawable.ic_star_outline)); + } else { + ((ImageView)getView().findViewById(R.id.fdFavorite)) + .setImageDrawable(getResources() + .getDrawable(R.drawable.ic_star)); + } + mContainerActivity.getFileOperationsHelper() + .toggleOfflineFile(getFile(), !getFile().isAvailableOffline()); + break; + } default: Log_OC.e(TAG, "Incorrect view clicked!"); break; } } - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - SwitchCompat favSwitch = getView().findViewById(R.id.fdFavorite); - mContainerActivity.getFileOperationsHelper().toggleOfflineFile(getFile(), favSwitch.isChecked()); - } - /** * Check if the fragment was created with an empty layout. An empty fragment can't show file details, must be replaced. * @@ -419,15 +459,13 @@ public void updateFileDetails(boolean transferring, boolean refresh) { setFilename(file.getFileName()); setFiletype(file); setFilesize(file.getFileLength()); - setTimeModified(file.getModificationTimestamp()); - SwitchCompat favSwitch = getView().findViewById(R.id.fdFavorite); - favSwitch.setChecked(file.isAvailableOffline()); - - setShareByLinkInfo(file.isSharedViaLink()); - - setShareWithUserInfo(); + if (file.isAvailableOffline()) { + ((ImageView)getView().findViewById(R.id.fdFavorite)).setImageDrawable(getResources().getDrawable(R.drawable.ic_star)); + } else { + ((ImageView)getView().findViewById(R.id.fdFavorite)).setImageDrawable(getResources().getDrawable(R.drawable.ic_star_outline)); + } // configure UI for depending upon local state of the file FileDownloaderBinder downloaderBinder = mContainerActivity.getFileDownloaderBinder(); @@ -448,6 +486,9 @@ public void updateFileDetails(boolean transferring, boolean refresh) { setButtonsForRemote(); } } + + setupViewPager(getView()); + getView().invalidate(); } @@ -634,9 +675,6 @@ private static void setListViewHeightBasedOnChildren(ListView listView) { */ private void setButtonsForTransferring() { if (!isEmpty()) { - // let's protect the user from himself ;) - getView().findViewById(R.id.fdFavorite).setEnabled(false); - // show the progress bar for the transfer getView().findViewById(R.id.fdProgressBlock).setVisibility(View.VISIBLE); TextView progressText = getView().findViewById(R.id.fdProgressText); @@ -660,8 +698,6 @@ private void setButtonsForTransferring() { */ private void setButtonsForDown() { if (!isEmpty()) { - getView().findViewById(R.id.fdFavorite).setEnabled(true); - // hides the progress bar getView().findViewById(R.id.fdProgressBlock).setVisibility(View.GONE); TextView progressText = getView().findViewById(R.id.fdProgressText); @@ -674,8 +710,6 @@ private void setButtonsForDown() { */ private void setButtonsForRemote() { if (!isEmpty()) { - getView().findViewById(R.id.fdFavorite).setEnabled(true); - // hides the progress bar getView().findViewById(R.id.fdProgressBlock).setVisibility(View.GONE); TextView progressText = getView().findViewById(R.id.fdProgressText); diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java new file mode 100644 index 000000000000..f3cc8d7908ce --- /dev/null +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java @@ -0,0 +1,175 @@ +/* + * Nextcloud Android client application + * + * @author Andy Scherzinger + * Copyright (C) 2018 Andy Scherzinger + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this program. If not, see . + */ + +package com.owncloud.android.ui.fragment; + +import android.accounts.Account; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.ListAdapter; +import android.widget.ListView; +import android.widget.TextView; + +import com.owncloud.android.R; +import com.owncloud.android.datamodel.FileDataStorageManager; +import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.lib.resources.shares.OCShare; +import com.owncloud.android.ui.activity.FileActivity; +import com.owncloud.android.ui.adapter.UserListAdapter; + +import java.util.ArrayList; + +public class FileDetailSharingFragment extends Fragment { + + private static final String ARG_FILE = "FILE"; + private static final String ARG_ACCOUNT = "ACCOUNT"; + + // to show share with users/groups info + private ArrayList mShares; + + private OCFile file; + private Account account; + + public static FileDetailSharingFragment newInstance(OCFile file, Account account) { + FileDetailSharingFragment fragment = new FileDetailSharingFragment(); + Bundle args = new Bundle(); + args.putParcelable(ARG_FILE, file); + args.putParcelable(ARG_ACCOUNT, account); + fragment.setArguments(args); + return fragment; + } + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, + ViewGroup container, + Bundle savedInstanceState) { + + file = getArguments().getParcelable(ARG_FILE); + account = getArguments().getParcelable(ARG_ACCOUNT); + + if (savedInstanceState != null) { + file = savedInstanceState.getParcelable(FileActivity.EXTRA_FILE); + account = savedInstanceState.getParcelable(FileActivity.EXTRA_ACCOUNT); + } + + View view = inflater.inflate(R.layout.file_details_sharing_fragment, container, false); + + setupView(view); + + return view; + } + + private void setupView(View view) { + // TODO populate sharing UI + + setShareByLinkInfo(file.isSharedViaLink(), view); + + setShareWithUserInfo(view); + } + + /** + * Updates Share by link data + * + * @param isShareByLink flag is share by link is enable + */ + private void setShareByLinkInfo(boolean isShareByLink, View view) { + TextView tv = view.findViewById(R.id.fdSharebyLink); + if (tv != null) { + tv.setText(isShareByLink ? R.string.filedetails_share_link_enable : + R.string.filedetails_share_link_disable); + } + ImageView linkIcon = view.findViewById(R.id.fdShareLinkIcon); + if (linkIcon != null) { + linkIcon.setVisibility(isShareByLink ? View.VISIBLE : View.GONE); + } + } + + /** + * Update Share With data + */ + private void setShareWithUserInfo(View view){ + // Get Users and Groups + if (((FileActivity) getActivity()).getStorageManager() != null) { + FileDataStorageManager fileDataStorageManager = ((FileActivity) getActivity()).getStorageManager(); + mShares = fileDataStorageManager.getSharesWithForAFile( + file.getRemotePath(),account.name + ); + + // Update list of users/groups + updateListOfUserGroups(view); + } + } + + private void updateListOfUserGroups(View view) { + // Update list of users/groups + // TODO Refactoring: create a new {@link ShareUserListAdapter} instance with every call should not be needed + UserListAdapter mUserGroupsAdapter = new UserListAdapter( + getActivity().getApplicationContext(), + R.layout.share_user_item, mShares + ); + + // Show data + ListView usersList = view.findViewById(R.id.fdshareUsersList); + + // No data + TextView noList = view.findViewById(R.id.fdShareNoUsers); + + if (mShares.size() > 0) { + usersList.setVisibility(View.VISIBLE); + usersList.setAdapter(mUserGroupsAdapter); + noList.setVisibility(View.GONE); + setListViewHeightBasedOnChildren(usersList); + + } else { + usersList.setVisibility(View.GONE); + noList.setVisibility(View.VISIBLE); + } + } + + /** + * Fix scroll in listview when the parent is a ScrollView + */ + private static void setListViewHeightBasedOnChildren(ListView listView) { + ListAdapter listAdapter = listView.getAdapter(); + if (listAdapter == null) { + return; + } + int desiredWidth = View.MeasureSpec.makeMeasureSpec(listView.getWidth(), View.MeasureSpec.AT_MOST); + int totalHeight = 0; + View view = null; + for (int i = 0; i < listAdapter.getCount(); i++) { + view = listAdapter.getView(i, view, listView); + if (i == 0) { + view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, ViewGroup.LayoutParams.WRAP_CONTENT)); + } + view.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED); + totalHeight += view.getMeasuredHeight(); + } + ViewGroup.LayoutParams params = listView.getLayoutParams(); + params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); + listView.setLayoutParams(params); + listView.requestLayout(); + } +} diff --git a/src/main/res/drawable/ic_star.xml b/src/main/res/drawable/ic_star.xml new file mode 100644 index 000000000000..c8f9664af7c6 --- /dev/null +++ b/src/main/res/drawable/ic_star.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/src/main/res/drawable/ic_star_outline.xml b/src/main/res/drawable/ic_star_outline.xml new file mode 100644 index 000000000000..cb5739cc333c --- /dev/null +++ b/src/main/res/drawable/ic_star_outline.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/src/main/res/drawable/ic_tag.xml b/src/main/res/drawable/ic_tag.xml new file mode 100644 index 000000000000..80a4f0f50db2 --- /dev/null +++ b/src/main/res/drawable/ic_tag.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/src/main/res/layout/file_details_activities_fragment.xml b/src/main/res/layout/file_details_activities_fragment.xml new file mode 100644 index 000000000000..0156bf608934 --- /dev/null +++ b/src/main/res/layout/file_details_activities_fragment.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/res/layout/file_details_fragment.xml b/src/main/res/layout/file_details_fragment.xml index 6d191433ade0..39854c05ee7c 100644 --- a/src/main/res/layout/file_details_fragment.xml +++ b/src/main/res/layout/file_details_fragment.xml @@ -29,110 +29,99 @@ android:layout_height="wrap_content" android:orientation="vertical"> - + + + + + android:layout_margin="@dimen/standard_margin" + android:orientation="vertical"> - + android:text="@string/placeholder_filename" + android:textSize="16sp" + android:textColor="@color/black"/> + android:gravity="center" + android:orientation="horizontal"> + + + android:text="@string/placeholder_fileSize" + android:textSize="16sp" /> - + android:gravity="end" + android:paddingEnd="@dimen/standard_quarter_padding" + android:paddingLeft="@dimen/zero" + android:paddingRight="@dimen/standard_quarter_padding" + android:paddingStart="@dimen/zero" + android:text="@string/info_separator" + android:textColor="@color/list_item_lastmod_and_filesize_text" + android:textSize="@dimen/two_line_secondary_text_size" /> - + - - - + - + - - - - - - - - + android:text="@string/downloader_download_in_progress_ticker" /> + android:indeterminateOnly="false" /> + android:src="@drawable/ic_cancel" /> - + + android:background="@color/list_divider_background" /> + + + + + android:orientation="vertical" + android:visibility="gone"> + android:textColor="@color/color_accent" /> + android:visibility="gone" /> + android:text="@string/filedetails_share_link_disable" /> + android:textColor="@color/color_accent" /> + android:visibility="gone" /> + android:textSize="@dimen/share_no_users_text_size" /> diff --git a/src/main/res/layout/file_details_sharing_fragment.xml b/src/main/res/layout/file_details_sharing_fragment.xml new file mode 100644 index 000000000000..9d512b1e5d34 --- /dev/null +++ b/src/main/res/layout/file_details_sharing_fragment.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 5dfffd02f699..e75e4de43c2e 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -784,4 +784,5 @@ Upload content from other apps Create new folder Virus detected. Upload cannot be completed! + Tags From dd050b0dc6a0408f8f74c0e060c1e57b59abc016 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Mon, 30 Apr 2018 18:54:43 +0200 Subject: [PATCH 02/27] new lines and license headers --- drawable_resources/ic_star.svg | 2 +- drawable_resources/ic_star_outline.svg | 2 +- drawable_resources/ic_tag.svg | 2 +- src/main/res/drawable/ic_star.xml | 19 +++++++++++++++++-- src/main/res/drawable/ic_star_outline.xml | 19 +++++++++++++++++-- src/main/res/drawable/ic_tag.xml | 19 +++++++++++++++++-- .../file_details_activities_fragment.xml | 2 +- .../layout/file_details_sharing_fragment.xml | 2 +- 8 files changed, 56 insertions(+), 11 deletions(-) diff --git a/drawable_resources/ic_star.svg b/drawable_resources/ic_star.svg index 92c32ed1c617..40c0577e5915 100644 --- a/drawable_resources/ic_star.svg +++ b/drawable_resources/ic_star.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/drawable_resources/ic_star_outline.svg b/drawable_resources/ic_star_outline.svg index 715b6588058b..638248c7c158 100644 --- a/drawable_resources/ic_star_outline.svg +++ b/drawable_resources/ic_star_outline.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/drawable_resources/ic_tag.svg b/drawable_resources/ic_tag.svg index 61c7eef9563f..fd1d1bf731cb 100644 --- a/drawable_resources/ic_tag.svg +++ b/drawable_resources/ic_tag.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/src/main/res/drawable/ic_star.xml b/src/main/res/drawable/ic_star.xml index c8f9664af7c6..62098dfa298b 100644 --- a/src/main/res/drawable/ic_star.xml +++ b/src/main/res/drawable/ic_star.xml @@ -1,8 +1,23 @@ - + - \ No newline at end of file + diff --git a/src/main/res/drawable/ic_star_outline.xml b/src/main/res/drawable/ic_star_outline.xml index cb5739cc333c..4920bfe44120 100644 --- a/src/main/res/drawable/ic_star_outline.xml +++ b/src/main/res/drawable/ic_star_outline.xml @@ -1,8 +1,23 @@ - + - \ No newline at end of file + diff --git a/src/main/res/drawable/ic_tag.xml b/src/main/res/drawable/ic_tag.xml index 80a4f0f50db2..83b704123a6a 100644 --- a/src/main/res/drawable/ic_tag.xml +++ b/src/main/res/drawable/ic_tag.xml @@ -1,8 +1,23 @@ - + - \ No newline at end of file + diff --git a/src/main/res/layout/file_details_activities_fragment.xml b/src/main/res/layout/file_details_activities_fragment.xml index 0156bf608934..ca619eecbf38 100644 --- a/src/main/res/layout/file_details_activities_fragment.xml +++ b/src/main/res/layout/file_details_activities_fragment.xml @@ -50,4 +50,4 @@ - \ No newline at end of file + diff --git a/src/main/res/layout/file_details_sharing_fragment.xml b/src/main/res/layout/file_details_sharing_fragment.xml index 9d512b1e5d34..20ac0b91a6c3 100644 --- a/src/main/res/layout/file_details_sharing_fragment.xml +++ b/src/main/res/layout/file_details_sharing_fragment.xml @@ -102,4 +102,4 @@ - \ No newline at end of file + From 7ff4f4e3785e28c3db7c4900594e69a37b9d8c81 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Mon, 30 Apr 2018 19:18:30 +0200 Subject: [PATCH 03/27] add initial loading of (all, not file specific) activities --- .../FileDetailActivitiesFragment.java | 218 +++++++++++++++++- 1 file changed, 214 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java index dde110dff5a9..0e6f7e7f47f3 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java @@ -21,26 +21,98 @@ package com.owncloud.android.ui.fragment; import android.accounts.Account; +import android.accounts.AuthenticatorException; +import android.accounts.OperationCanceledException; +import android.content.Context; +import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v4.app.Fragment; +import android.support.v4.widget.SwipeRefreshLayout; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ProgressBar; import android.widget.TextView; +import com.owncloud.android.MainApp; import com.owncloud.android.R; +import com.owncloud.android.authentication.AccountUtils; +import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.lib.common.OwnCloudAccount; +import com.owncloud.android.lib.common.OwnCloudClient; +import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; +import com.owncloud.android.lib.common.operations.RemoteOperationResult; +import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.lib.resources.activities.GetRemoteActivitiesOperation; +import com.owncloud.android.lib.resources.activities.models.RichObject; import com.owncloud.android.ui.activity.FileActivity; +import com.owncloud.android.ui.adapter.ActivityListAdapter; +import com.owncloud.android.ui.interfaces.ActivityListInterface; -public class FileDetailActivitiesFragment extends Fragment { +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindAnim; +import butterknife.BindString; +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.Unbinder; + +public class FileDetailActivitiesFragment extends Fragment implements ActivityListInterface { + private static final String TAG = FileDetailActivitiesFragment.class.getSimpleName(); private static final String ARG_FILE = "FILE"; private static final String ARG_ACCOUNT = "ACCOUNT"; + private ActivityListAdapter adapter; + private Unbinder unbinder; + private OwnCloudClient ownCloudClient; + private AsyncTask updateTask; + private OCFile file; private Account account; + private String nextPageUrl; + private boolean isLoadingActivities; + + @BindView(R.id.empty_list_view) + public LinearLayout emptyContentContainer; + + @BindView(R.id.swipe_containing_list) + public SwipeRefreshLayout swipeListRefreshLayout; + + @BindView(R.id.swipe_containing_empty) + public SwipeRefreshLayout swipeEmptyListRefreshLayout; + + @BindView(R.id.empty_list_view_text) + public TextView emptyContentMessage; + + @BindView(R.id.empty_list_view_headline) + public TextView emptyContentHeadline; + + @BindView(R.id.empty_list_icon) + public ImageView emptyContentIcon; + + @BindView(R.id.empty_list_progress) + public ProgressBar emptyContentProgressBar; + + @BindView(android.R.id.list) + public RecyclerView recyclerView; + + @BindString(R.string.activities_no_results_headline) + public String noResultsHeadline; + + @BindString(R.string.activities_no_results_message) + public String noResultsMessage; + public static FileDetailActivitiesFragment newInstance(OCFile file, Account account) { FileDetailActivitiesFragment fragment = new FileDetailActivitiesFragment(); Bundle args = new Bundle(); @@ -64,13 +136,151 @@ public View onCreateView(@NonNull LayoutInflater inflater, } View view = inflater.inflate(R.layout.file_details_activities_fragment, container, false); + unbinder = ButterKnife.bind(this, view); - setupView(view); + setupView(); + fetchAndSetData(null); return view; } - private void setupView(View view) { - // TODO populate activities list + @Override + public void onDestroy() { + super.onDestroy(); + unbinder.unbind(); + } + + private void setupView() { + FileDataStorageManager storageManager = new FileDataStorageManager(account, getActivity().getContentResolver()); + adapter = new ActivityListAdapter(getContext(), this, storageManager); + recyclerView.setAdapter(adapter); + + LinearLayoutManager layoutManager = new LinearLayoutManager(getContext()); + + recyclerView.setLayoutManager(layoutManager); + recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + + int visibleItemCount = recyclerView.getChildCount(); + int totalItemCount = layoutManager.getItemCount(); + int firstVisibleItemIndex = layoutManager.findFirstVisibleItemPosition(); + + // synchronize loading state when item count changes + if (!isLoadingActivities && (totalItemCount - visibleItemCount) <= (firstVisibleItemIndex + 5) + && nextPageUrl != null && !nextPageUrl.isEmpty()) { + // Almost reached the end, continue to load new activities + fetchAndSetData(nextPageUrl); + } + } + }); + } + + /** + * @param pageUrl String + */ + private void fetchAndSetData(String pageUrl) { + final Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(MainApp.getAppContext()); + final Context context = MainApp.getAppContext(); + + Thread t = new Thread(() -> { + OwnCloudAccount ocAccount; + try { + ocAccount = new OwnCloudAccount(currentAccount, context); + ownCloudClient = OwnCloudClientManagerFactory.getDefaultSingleton(). + getClientFor(ocAccount, MainApp.getAppContext()); + ownCloudClient.setOwnCloudVersion(AccountUtils.getServerVersion(currentAccount)); + isLoadingActivities = true; + //getActivity().runOnUiThread(() -> setIndeterminate(isLoadingActivities)); + + GetRemoteActivitiesOperation getRemoteNotificationOperation = new GetRemoteActivitiesOperation(); + if (pageUrl != null) { + getRemoteNotificationOperation.setNextUrl(pageUrl); + } + + Log_OC.d(TAG, "BEFORE getRemoteActivitiesOperation.execute"); + final RemoteOperationResult result = getRemoteNotificationOperation.execute(ownCloudClient); + + if (result.isSuccess() && result.getData() != null) { + final ArrayList data = result.getData(); + final ArrayList activities = (ArrayList) data.get(0); + nextPageUrl = (String) data.get(1); + + getActivity().runOnUiThread(() -> { + populateList(activities, ownCloudClient, pageUrl == null); + if (activities.size() > 0) { + swipeEmptyListRefreshLayout.setVisibility(View.GONE); + swipeListRefreshLayout.setVisibility(View.VISIBLE); + } else { + setEmptyContent(noResultsHeadline, noResultsMessage); + swipeListRefreshLayout.setVisibility(View.GONE); + swipeEmptyListRefreshLayout.setVisibility(View.VISIBLE); + } + isLoadingActivities = false; + //setIndeterminate(isLoadingActivities); + }); + } else { + Log_OC.d(TAG, result.getLogMessage()); + // show error + String logMessage = result.getLogMessage(); + if (result.getHttpCode() == 304) { + logMessage = noResultsMessage; + } + final String finalLogMessage = logMessage; + getActivity().runOnUiThread(() -> { + setEmptyContent(noResultsHeadline, finalLogMessage); + isLoadingActivities = false; + //setIndeterminate(isLoadingActivities); + }); + } + + hideRefreshLayoutLoader(); + } catch (com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException e) { + Log_OC.e(TAG, "Account not found", e); + } catch (IOException e) { + Log_OC.e(TAG, "IO error", e); + } catch (OperationCanceledException e) { + Log_OC.e(TAG, "Operation has been canceled", e); + } catch (AuthenticatorException e) { + Log_OC.e(TAG, "Authentication Exception", e); + } + } + ); + + t.start(); + } + + private void populateList(List activities, OwnCloudClient mClient, boolean clear) { + adapter.setActivityItems(activities, mClient, clear); + } + + private void setEmptyContent(String headline, String message) { + if (emptyContentContainer != null && emptyContentMessage != null) { + emptyContentHeadline.setText(headline); + emptyContentMessage.setText(message); + + emptyContentProgressBar.setVisibility(View.GONE); + emptyContentIcon.setVisibility(View.VISIBLE); + } + } + + private void hideRefreshLayoutLoader() { + getActivity().runOnUiThread(() -> { + if (swipeListRefreshLayout != null) { + swipeListRefreshLayout.setRefreshing(false); + } + if (swipeEmptyListRefreshLayout != null) { + swipeEmptyListRefreshLayout.setRefreshing(false); + } + isLoadingActivities = false; + //setIndeterminate(isLoadingActivities); + }); + } + + @Override + public void onActivityClicked(RichObject richObject) { + // TODO implement activity click } } From 6013956150bdad5db58c9b471655a03ae2a2a073 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Mon, 30 Apr 2018 19:24:48 +0200 Subject: [PATCH 04/27] organize imports --- .../android/ui/fragment/FileDetailActivitiesFragment.java | 2 -- .../com/owncloud/android/ui/fragment/FileDetailFragment.java | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java index 0e6f7e7f47f3..7b55c8fb2773 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java @@ -27,7 +27,6 @@ import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; @@ -60,7 +59,6 @@ import java.util.ArrayList; import java.util.List; -import butterknife.BindAnim; import butterknife.BindString; import butterknife.BindView; import butterknife.ButterKnife; diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index 666905e8b5ed..75885b6c3625 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -27,7 +27,6 @@ import android.support.design.widget.Snackbar; import android.support.design.widget.TabLayout; import android.support.v4.view.ViewPager; -import android.support.v7.widget.SwitchCompat; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -35,7 +34,6 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; -import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.ListAdapter; import android.widget.ListView; From d1ba80eb4ac8851e83b09b177c5089fd1fc7be63 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Mon, 30 Apr 2018 19:26:21 +0200 Subject: [PATCH 05/27] cleanup --- .../android/ui/fragment/FileDetailActivitiesFragment.java | 1 - .../com/owncloud/android/ui/fragment/FileDetailFragment.java | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java index 7b55c8fb2773..2006715205d0 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java @@ -73,7 +73,6 @@ public class FileDetailActivitiesFragment extends Fragment implements ActivityLi private ActivityListAdapter adapter; private Unbinder unbinder; private OwnCloudClient ownCloudClient; - private AsyncTask updateTask; private OCFile file; private Account account; diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index 75885b6c3625..56e5dbb283e2 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -189,12 +189,12 @@ public void onTabSelected(TabLayout.Tab tab) { @Override public void onTabUnselected(TabLayout.Tab tab) { - + // unused at the moment } @Override public void onTabReselected(TabLayout.Tab tab) { - + // unused at the moment } }); } From 19edfb183a443b9f310b24a7edaea055844470fb Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Wed, 2 May 2018 08:49:32 +0200 Subject: [PATCH 06/27] filter activity by file Id Signed-off-by: tobiasKaminsky --- build.gradle | 6 +++--- .../android/ui/fragment/FileDetailActivitiesFragment.java | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 623df81f6617..b0551ab8335c 100644 --- a/build.gradle +++ b/build.gradle @@ -194,9 +194,9 @@ dependencies { // dependencies for app building implementation 'com.android.support:multidex:1.0.3' // implementation project('nextcloud-android-library') - genericImplementation "com.github.nextcloud:android-library:${androidLibraryVersion}" - gplayImplementation "com.github.nextcloud:android-library:${androidLibraryVersion}" - versionDevImplementation 'com.github.nextcloud:android-library:master-SNAPSHOT' // use always latest master + genericImplementation "com.github.nextcloud:android-library:filterActivities-SNAPSHOT" + gplayImplementation "com.github.nextcloud:android-library:filterActivities-SNAPSHOT" + versionDevImplementation 'com.github.nextcloud:android-library:filterActivities-SNAPSHOT' // use always latest master implementation "com.android.support:support-v4:${supportLibraryVersion}" implementation "com.android.support:design:${supportLibraryVersion}" implementation 'com.jakewharton:disklrucache:2.0.2' diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java index 2006715205d0..831426a59b94 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java @@ -24,7 +24,6 @@ import android.accounts.AuthenticatorException; import android.accounts.OperationCanceledException; import android.content.Context; -import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; @@ -192,7 +191,9 @@ private void fetchAndSetData(String pageUrl) { isLoadingActivities = true; //getActivity().runOnUiThread(() -> setIndeterminate(isLoadingActivities)); - GetRemoteActivitiesOperation getRemoteNotificationOperation = new GetRemoteActivitiesOperation(); + GetRemoteActivitiesOperation getRemoteNotificationOperation = new GetRemoteActivitiesOperation( + file.getLocalId()); + if (pageUrl != null) { getRemoteNotificationOperation.setNextUrl(pageUrl); } From 46f226ba3a90f40f93dbb0f5bc35deb324168202 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Thu, 3 May 2018 15:14:26 +0200 Subject: [PATCH 07/27] move menu to file name, hide tags (to be implemented later) --- .../ui/fragment/FileDetailFragment.java | 49 +-- src/main/res/layout/file_details_fragment.xml | 279 ++++++++---------- 2 files changed, 143 insertions(+), 185 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index 56e5dbb283e2..ca5ac90f0710 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -29,7 +29,6 @@ import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.Menu; -import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; @@ -37,6 +36,7 @@ import android.widget.ImageView; import android.widget.ListAdapter; import android.widget.ListView; +import android.widget.PopupMenu; import android.widget.ProgressBar; import android.widget.TextView; @@ -153,20 +153,29 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, mView = inflater.inflate(mLayout, null); if (mLayout == R.layout.file_details_fragment) { - int accentColor = ThemeUtils.primaryAccentColor(getContext()); ProgressBar progressBar = mView.findViewById(R.id.fdProgressBar); ThemeUtils.colorHorizontalProgressBar(progressBar, ThemeUtils.primaryAccentColor(getContext())); mProgressListener = new ProgressListener(progressBar); mView.findViewById(R.id.fdCancelBtn).setOnClickListener(this); mView.findViewById(R.id.fdFavorite).setOnClickListener(this); - ((TextView)mView.findViewById(R.id.fdShareTitle)).setTextColor(accentColor); - ((TextView)mView.findViewById(R.id.fdShareWithUsersTitle)).setTextColor(accentColor); + mView.findViewById(R.id.overflow_menu).setOnClickListener(this); } updateFileDetails(false, false); return mView; } + public void onOverflowIconClicked(View view) { + PopupMenu popup = new PopupMenu(getActivity(), view); + popup.inflate(R.menu.file_actions_menu); + prepareOptionsMenu(popup.getMenu()); + + popup.setOnMenuItemClickListener(item -> { + return optionsItemSelected(item); + }); + popup.show(); + } + private void setupViewPager(View view) { TabLayout tabLayout = view.findViewById(R.id.tab_layout); tabLayout.removeAllTabs(); @@ -224,22 +233,19 @@ public View getView() { return super.getView() == null ? mView : super.getView(); } - - /** - * {@inheritDoc} - */ @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); - inflater.inflate(R.menu.file_actions_menu, menu); - } + public void onPrepareOptionsMenu(Menu menu) { + super.onPrepareOptionsMenu(menu); + MenuItem item; + for (int i = 0; i < menu.size(); i++) { + item = menu.getItem(i); + item.setVisible(false); + item.setEnabled(false); + } + } - /** - * {@inheritDoc} - */ - @Override - public void onPrepareOptionsMenu(Menu menu) { + private void prepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); if (mContainerActivity.getStorageManager() != null) { @@ -336,11 +342,7 @@ public void onPrepareOptionsMenu(Menu menu) { } } - /** - * {@inheritDoc} - */ - @Override - public boolean onOptionsItemSelected(MenuItem item) { + public boolean optionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_send_share_file: { if(getFile().isSharedWithMe() && !getFile().canReshare()){ @@ -403,6 +405,9 @@ public void onClick(View v) { .toggleOfflineFile(getFile(), !getFile().isAvailableOffline()); break; } + case R.id.overflow_menu: { + onOverflowIconClicked(v); + } default: Log_OC.e(TAG, "Incorrect view clicked!"); break; diff --git a/src/main/res/layout/file_details_fragment.xml b/src/main/res/layout/file_details_fragment.xml index 39854c05ee7c..2c0ce2d6328d 100644 --- a/src/main/res/layout/file_details_fragment.xml +++ b/src/main/res/layout/file_details_fragment.xml @@ -19,6 +19,7 @@ --> - - + android:paddingTop="@dimen/standard_padding" + android:paddingLeft="@dimen/standard_padding" + android:paddingRight="@dimen/standard_padding" + android:paddingBottom="@dimen/standard_half_padding" + android:orientation="horizontal"> - - + android:layout_weight="1" + android:orientation="vertical"> - + android:gravity="center" + android:orientation="horizontal"> - + + + - + + + - + + + + + + + + + + + + + android:layout_marginBottom="@dimen/standard_quarter_margin" + android:gravity="center" + android:orientation="horizontal"> - + android:layout_weight="1" + android:indeterminate="false" + android:indeterminateOnly="false" /> - - - - - - - + android:layout_marginLeft="@dimen/standard_half_margin" + android:layout_marginStart="@dimen/standard_half_margin" + android:background="@android:color/transparent" + android:contentDescription="@string/common_cancel" + android:src="@drawable/ic_cancel" /> @@ -174,6 +197,8 @@ android:id="@+id/tab_layout" android:layout_width="match_parent" android:layout_height="wrap_content" + app:tabGravity="center" + app:tabMode="scrollable" android:background="@color/white" /> - - - - - - - - - - - - - - - - - - - From ce66e125e2dc677ff3b79b7e2f0dcddd20ecd203 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Fri, 4 May 2018 09:20:20 +0200 Subject: [PATCH 08/27] simplify menu item filtering code --- .../ui/fragment/FileDetailFragment.java | 90 ++++--------------- 1 file changed, 18 insertions(+), 72 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index ca5ac90f0710..14838214d628 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -259,87 +259,33 @@ private void prepareOptionsMenu(Menu menu) { mf.filter(menu, true); } - // additional restriction for this fragment - MenuItem item = menu.findItem(R.id.action_see_details); - if (item != null) { - item.setVisible(false); - item.setEnabled(false); - } + // restriction for this fragment + hideMenuItem(menu.findItem(R.id.action_see_details)); + hideMenuItem(menu.findItem(R.id.action_select_all)); + hideMenuItem(menu.findItem(R.id.action_move)); + hideMenuItem(menu.findItem(R.id.action_copy)); + hideMenuItem(menu.findItem(R.id.action_favorite)); + hideMenuItem(menu.findItem(R.id.action_unset_favorite)); + hideMenuItem(menu.findItem(R.id.action_search)); - // additional restriction for this fragment - item = menu.findItem(R.id.action_select_all); - if (item != null) { - item.setVisible(false); - item.setEnabled(false); + // dual pane restrictions + if (!getResources().getBoolean(R.bool.large_land_layout)){ + hideMenuItem(menu.findItem(R.id.action_switch_view)); + hideMenuItem(menu.findItem(R.id.action_sync_account)); + hideMenuItem(menu.findItem(R.id.action_sort)); } - // additional restriction for this fragment - item = menu.findItem(R.id.action_move); - if (item != null) { - item.setVisible(false); - item.setEnabled(false); - } - - // additional restriction for this fragment - item = menu.findItem(R.id.action_copy); - if (item != null) { - item.setVisible(false); - item.setEnabled(false); - } - - // additional restriction for this fragment - item = menu.findItem(R.id.action_favorite); - if (item != null) { - item.setVisible(false); - item.setEnabled(false); - } - - // additional restriction for this fragment - item = menu.findItem(R.id.action_unset_favorite); - if (item != null) { - item.setVisible(false); - item.setEnabled(false); + // share restrictions + if (getFile().isSharedWithMe() && !getFile().canReshare()) { + hideMenuItem(menu.findItem(R.id.action_send_share_file)); } + } - // additional restriction for this fragment - item = menu.findItem(R.id.action_search); + private void hideMenuItem(MenuItem item) { if (item != null) { item.setVisible(false); item.setEnabled(false); } - - - Boolean dualPane = getResources().getBoolean(R.bool.large_land_layout); - - item = menu.findItem(R.id.action_switch_view); - if (item != null && !dualPane){ - item.setVisible(false); - item.setEnabled(false); - } - - item = menu.findItem(R.id.action_sync_account); - if (item != null && !dualPane) { - item.setVisible(false); - item.setEnabled(false); - } - - item = menu.findItem(R.id.action_sort); - if (item != null && !dualPane) { - item.setVisible(false); - item.setEnabled(false); - } - - item = menu.findItem(R.id.action_send_share_file); - if (item != null) { - ThemeUtils.tintDrawable(item.getIcon(), ThemeUtils.fontColor(getContext())); - item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); - if (getFile().isSharedWithMe() && !getFile().canReshare()) { - // additional restriction for this fragment - - item.setVisible(false); - item.setEnabled(false); - } - } } public boolean optionsItemSelected(MenuItem item) { From e42ff25b924001ad72559caab984c4dc081c221f Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Fri, 4 May 2018 09:27:19 +0200 Subject: [PATCH 09/27] move menu filtering to menu filter helper --- .../android/files/FileMenuFilter.java | 14 +++++-- .../ui/fragment/FileDetailFragment.java | 41 +++++++------------ 2 files changed, 25 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/owncloud/android/files/FileMenuFilter.java b/src/main/java/com/owncloud/android/files/FileMenuFilter.java index 4c9d07740c13..0dff0ea064e0 100644 --- a/src/main/java/com/owncloud/android/files/FileMenuFilter.java +++ b/src/main/java/com/owncloud/android/files/FileMenuFilter.java @@ -124,10 +124,16 @@ public void filter(Menu menu, boolean inSingleFileFragment) { } } - private void hideAll(Menu menu) { - MenuItem item; - for (int i = 0; i < menu.size(); i++) { - item = menu.getItem(i); + public static void hideAll(Menu menu) { + if (menu != null) { + for (int i = 0; i < menu.size(); i++) { + hideMenuItem(menu.getItem(i)); + } + } + } + + public static void hideMenuItem(MenuItem item) { + if (item != null) { item.setVisible(false); item.setEnabled(false); } diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index 14838214d628..ee01c1265a4b 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -237,12 +237,7 @@ public View getView() { public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); - MenuItem item; - for (int i = 0; i < menu.size(); i++) { - item = menu.getItem(i); - item.setVisible(false); - item.setEnabled(false); - } + FileMenuFilter.hideAll(menu); } private void prepareOptionsMenu(Menu menu) { @@ -260,31 +255,24 @@ private void prepareOptionsMenu(Menu menu) { } // restriction for this fragment - hideMenuItem(menu.findItem(R.id.action_see_details)); - hideMenuItem(menu.findItem(R.id.action_select_all)); - hideMenuItem(menu.findItem(R.id.action_move)); - hideMenuItem(menu.findItem(R.id.action_copy)); - hideMenuItem(menu.findItem(R.id.action_favorite)); - hideMenuItem(menu.findItem(R.id.action_unset_favorite)); - hideMenuItem(menu.findItem(R.id.action_search)); + FileMenuFilter.hideMenuItem(menu.findItem(R.id.action_see_details)); + FileMenuFilter.hideMenuItem(menu.findItem(R.id.action_select_all)); + FileMenuFilter.hideMenuItem(menu.findItem(R.id.action_move)); + FileMenuFilter.hideMenuItem(menu.findItem(R.id.action_copy)); + FileMenuFilter.hideMenuItem(menu.findItem(R.id.action_favorite)); + FileMenuFilter.hideMenuItem(menu.findItem(R.id.action_unset_favorite)); + FileMenuFilter.hideMenuItem(menu.findItem(R.id.action_search)); // dual pane restrictions if (!getResources().getBoolean(R.bool.large_land_layout)){ - hideMenuItem(menu.findItem(R.id.action_switch_view)); - hideMenuItem(menu.findItem(R.id.action_sync_account)); - hideMenuItem(menu.findItem(R.id.action_sort)); + FileMenuFilter.hideMenuItem(menu.findItem(R.id.action_switch_view)); + FileMenuFilter.hideMenuItem(menu.findItem(R.id.action_sync_account)); + FileMenuFilter.hideMenuItem(menu.findItem(R.id.action_sort)); } // share restrictions if (getFile().isSharedWithMe() && !getFile().canReshare()) { - hideMenuItem(menu.findItem(R.id.action_send_share_file)); - } - } - - private void hideMenuItem(MenuItem item) { - if (item != null) { - item.setVisible(false); - item.setEnabled(false); + FileMenuFilter.hideMenuItem(menu.findItem(R.id.action_send_share_file)); } } @@ -338,7 +326,7 @@ public void onClick(View v) { break; } case R.id.fdFavorite: { - if (getFile().isAvailableOffline()) { + if (getFile().getIsFavorite()) { ((ImageView)getView().findViewById(R.id.fdFavorite)). setImageDrawable(getResources() .getDrawable(R.drawable.ic_star_outline)); @@ -347,6 +335,7 @@ public void onClick(View v) { .setImageDrawable(getResources() .getDrawable(R.drawable.ic_star)); } + mContainerActivity.getFileOperationsHelper() .toggleOfflineFile(getFile(), !getFile().isAvailableOffline()); break; @@ -410,7 +399,7 @@ public void updateFileDetails(boolean transferring, boolean refresh) { setFilesize(file.getFileLength()); setTimeModified(file.getModificationTimestamp()); - if (file.isAvailableOffline()) { + if (file.getIsFavorite()) { ((ImageView)getView().findViewById(R.id.fdFavorite)).setImageDrawable(getResources().getDrawable(R.drawable.ic_star)); } else { ((ImageView)getView().findViewById(R.id.fdFavorite)).setImageDrawable(getResources().getDrawable(R.drawable.ic_star_outline)); From 6952e647bcaee1bab47c6b4dea4de8681fbbc935 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Fri, 4 May 2018 09:34:31 +0200 Subject: [PATCH 10/27] further optimize menu item filtering code --- .../android/files/FileMenuFilter.java | 32 +++++++++++-------- .../ui/fragment/FileDetailFragment.java | 26 ++++++++------- 2 files changed, 34 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/owncloud/android/files/FileMenuFilter.java b/src/main/java/com/owncloud/android/files/FileMenuFilter.java index 0dff0ea064e0..7196c92254fa 100644 --- a/src/main/java/com/owncloud/android/files/FileMenuFilter.java +++ b/src/main/java/com/owncloud/android/files/FileMenuFilter.java @@ -104,22 +104,13 @@ public void filter(Menu menu, boolean inSingleFileFragment) { List toHide = new ArrayList<>(); filter(toShow, toHide, inSingleFileFragment); - - MenuItem item; + for (int i : toShow) { - item = menu.findItem(i); - if (item != null) { - item.setVisible(true); - item.setEnabled(true); - } + showMenuItem(menu.findItem(i)); } for (int i : toHide) { - item = menu.findItem(i); - if (item != null) { - item.setVisible(false); - item.setEnabled(false); - } + hideMenuItem(menu.findItem(i)); } } } @@ -132,13 +123,28 @@ public static void hideAll(Menu menu) { } } - public static void hideMenuItem(MenuItem item) { + private static void hideMenuItem(MenuItem item) { if (item != null) { item.setVisible(false); item.setEnabled(false); } } + private static void showMenuItem(MenuItem item) { + if (item != null) { + item.setVisible(true); + item.setEnabled(true); + } + } + + public static void hideMenuItems(MenuItem... items) { + if (items != null) { + for (MenuItem item : items) { + hideMenuItem(item); + } + } + } + /** * Performs the real filtering, to be applied in the {@link Menu} by the caller methods. * diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index ee01c1265a4b..562d0e74271b 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -255,24 +255,28 @@ private void prepareOptionsMenu(Menu menu) { } // restriction for this fragment - FileMenuFilter.hideMenuItem(menu.findItem(R.id.action_see_details)); - FileMenuFilter.hideMenuItem(menu.findItem(R.id.action_select_all)); - FileMenuFilter.hideMenuItem(menu.findItem(R.id.action_move)); - FileMenuFilter.hideMenuItem(menu.findItem(R.id.action_copy)); - FileMenuFilter.hideMenuItem(menu.findItem(R.id.action_favorite)); - FileMenuFilter.hideMenuItem(menu.findItem(R.id.action_unset_favorite)); - FileMenuFilter.hideMenuItem(menu.findItem(R.id.action_search)); + FileMenuFilter.hideMenuItems( + menu.findItem(R.id.action_see_details), + menu.findItem(R.id.action_select_all), + menu.findItem(R.id.action_move), + menu.findItem(R.id.action_copy), + menu.findItem(R.id.action_favorite), + menu.findItem(R.id.action_unset_favorite), + menu.findItem(R.id.action_search) + ); // dual pane restrictions if (!getResources().getBoolean(R.bool.large_land_layout)){ - FileMenuFilter.hideMenuItem(menu.findItem(R.id.action_switch_view)); - FileMenuFilter.hideMenuItem(menu.findItem(R.id.action_sync_account)); - FileMenuFilter.hideMenuItem(menu.findItem(R.id.action_sort)); + FileMenuFilter.hideMenuItems( + menu.findItem(R.id.action_switch_view), + menu.findItem(R.id.action_sync_account), + menu.findItem(R.id.action_sort) + ); } // share restrictions if (getFile().isSharedWithMe() && !getFile().canReshare()) { - FileMenuFilter.hideMenuItem(menu.findItem(R.id.action_send_share_file)); + FileMenuFilter.hideMenuItems(menu.findItem(R.id.action_send_share_file)); } } From af4918deaf96d2cdefc0659415020e99f3e5f407 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Fri, 4 May 2018 12:02:30 +0200 Subject: [PATCH 11/27] WiP preview image in toolbar --- .../android/files/FileMenuFilter.java | 2 +- .../ui/fragment/FileDetailFragment.java | 159 +++++++++++++----- src/main/res/layout/file_details_fragment.xml | 1 - src/main/res/layout/toolbar_preview.xml | 53 ++++++ src/main/res/layout/toolbar_standard.xml | 57 ++++--- 5 files changed, 203 insertions(+), 69 deletions(-) create mode 100644 src/main/res/layout/toolbar_preview.xml diff --git a/src/main/java/com/owncloud/android/files/FileMenuFilter.java b/src/main/java/com/owncloud/android/files/FileMenuFilter.java index 7196c92254fa..0ef99cada9ce 100644 --- a/src/main/java/com/owncloud/android/files/FileMenuFilter.java +++ b/src/main/java/com/owncloud/android/files/FileMenuFilter.java @@ -104,7 +104,7 @@ public void filter(Menu menu, boolean inSingleFileFragment) { List toHide = new ArrayList<>(); filter(toShow, toHide, inSingleFileFragment); - + for (int i : toShow) { showMenuItem(menu.findItem(i)); } diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index 562d0e74271b..b605ae2aad11 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -23,7 +23,11 @@ import android.accounts.Account; import android.graphics.Bitmap; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.LayerDrawable; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.design.widget.Snackbar; import android.support.design.widget.TabLayout; import android.support.v4.view.ViewPager; @@ -33,6 +37,7 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; +import android.webkit.URLUtil; import android.widget.ImageView; import android.widget.ListAdapter; import android.widget.ListView; @@ -40,6 +45,9 @@ import android.widget.ProgressBar; import android.widget.TextView; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.animation.GlideAnimation; +import com.bumptech.glide.request.target.SimpleTarget; import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.FileDataStorageManager; @@ -53,6 +61,7 @@ import com.owncloud.android.lib.resources.shares.OCShare; import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.activity.FileDisplayActivity; +import com.owncloud.android.ui.activity.ToolbarActivity; import com.owncloud.android.ui.adapter.FileDetailTabAdapter; import com.owncloud.android.ui.adapter.UserListAdapter; import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment; @@ -71,14 +80,16 @@ */ public class FileDetailFragment extends FileFragment implements OnClickListener { - private int mLayout; - private View mView; - private Account mAccount; + private int layout; + private View view; + private ImageView previewImage; + private boolean previewLoaded; + private Account account; - public ProgressListener mProgressListener; + public ProgressListener progressListener; // to show share with users/groups info - private ArrayList mShares; + private ArrayList shares; private static final String TAG = FileDetailFragment.class.getSimpleName(); public static final String FTAG_CONFIRMATION = "REMOVE_CONFIRMATION_FRAGMENT"; @@ -115,9 +126,9 @@ public static FileDetailFragment newInstance(OCFile fileToDetail, Account accoun */ public FileDetailFragment() { super(); - mAccount = null; - mLayout = R.layout.file_details_empty; - mProgressListener = null; + account = null; + layout = R.layout.file_details_empty; + progressListener = null; } @Override @@ -126,6 +137,10 @@ public void onResume() { if (getActivity() != null) { AnalyticsUtils.setCurrentScreenName(getActivity(), SCREEN_NAME, TAG); } + + if (previewImage != null && MimeTypeUtil.isImage(getFile()) && previewLoaded) { + previewImage.setVisibility(View.VISIBLE); + } } @Override @@ -135,34 +150,82 @@ public void onActivityCreated(Bundle savedInstanceState) { } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { setFile(getArguments().getParcelable(ARG_FILE)); - mAccount = getArguments().getParcelable(ARG_ACCOUNT); + account = getArguments().getParcelable(ARG_ACCOUNT); if (savedInstanceState != null) { setFile(savedInstanceState.getParcelable(FileActivity.EXTRA_FILE)); - mAccount = savedInstanceState.getParcelable(FileActivity.EXTRA_ACCOUNT); + account = savedInstanceState.getParcelable(FileActivity.EXTRA_ACCOUNT); } - if (getFile() != null && mAccount != null) { - mLayout = R.layout.file_details_fragment; + if (getFile() != null && account != null) { + layout = R.layout.file_details_fragment; } - mView = inflater.inflate(mLayout, null); + view = inflater.inflate(layout, null); - if (mLayout == R.layout.file_details_fragment) { - ProgressBar progressBar = mView.findViewById(R.id.fdProgressBar); + if (layout == R.layout.file_details_fragment) { + ProgressBar progressBar = view.findViewById(R.id.fdProgressBar); ThemeUtils.colorHorizontalProgressBar(progressBar, ThemeUtils.primaryAccentColor(getContext())); - mProgressListener = new ProgressListener(progressBar); - mView.findViewById(R.id.fdCancelBtn).setOnClickListener(this); - mView.findViewById(R.id.fdFavorite).setOnClickListener(this); - mView.findViewById(R.id.overflow_menu).setOnClickListener(this); + progressListener = new ProgressListener(progressBar); + view.findViewById(R.id.fdCancelBtn).setOnClickListener(this); + view.findViewById(R.id.fdFavorite).setOnClickListener(this); + view.findViewById(R.id.overflow_menu).setOnClickListener(this); + previewImage = getActivity().findViewById(R.id.preview_image); + if (getFile() != null && account != null && MimeTypeUtil.isImage(getFile())) { + setHeaderImage(); + } } updateFileDetails(false, false); - return mView; + return view; + } + + private void setHeaderImage() { + if (mContainerActivity.getStorageManager().getCapability(account.name).getServerBackground() != null) { + + if (previewImage != null) { + + String background = mContainerActivity.getStorageManager().getCapability(account.name).getServerBackground(); + + int primaryColor = ThemeUtils.primaryColor(account, getContext()); + + if (URLUtil.isValidUrl(background)) { + // background image + SimpleTarget target = new SimpleTarget() { + @Override + public void onResourceReady(Drawable resource, GlideAnimation glideAnimation) { + Drawable[] drawables = {new ColorDrawable(primaryColor), resource}; + LayerDrawable layerDrawable = new LayerDrawable(drawables); + previewImage.setImageDrawable(layerDrawable); + previewImage.setVisibility(View.VISIBLE); + ((ToolbarActivity)getActivity()).getSupportActionBar().setTitle(null); + ((ToolbarActivity)getActivity()).getSupportActionBar().setBackgroundDrawable(null); + previewLoaded = true; + } + + @Override + public void onLoadFailed(Exception e, Drawable errorDrawable) { + previewImage.setVisibility(View.GONE); + } + }; + + Glide.with(this) + .load(background) + .centerCrop() + .placeholder(R.drawable.background) + .error(R.drawable.background) + .crossFade() + .into(target); + } else { + // hide image + previewImage.setVisibility(View.GONE); + } + } + } } public void onOverflowIconClicked(View view) { @@ -187,7 +250,7 @@ private void setupViewPager(View view) { final ViewPager viewPager = view.findViewById(R.id.pager); final FileDetailTabAdapter adapter = new FileDetailTabAdapter - (getFragmentManager(), getFile(),mAccount); + (getFragmentManager(), getFile(), account); viewPager.setAdapter(adapter); viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @@ -209,10 +272,10 @@ public void onTabReselected(TabLayout.Tab tab) { } @Override - public void onSaveInstanceState(Bundle outState) { + public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable(FileActivity.EXTRA_FILE, getFile()); - outState.putParcelable(FileActivity.EXTRA_ACCOUNT, mAccount); + outState.putParcelable(FileActivity.EXTRA_ACCOUNT, account); } @Override @@ -224,13 +287,17 @@ public void onStart() { @Override public void onStop() { leaveTransferProgress(); + if (previewImage != null) { + previewImage.setVisibility(View.GONE); + } + super.onStop(); } @Override public View getView() { - return super.getView() == null ? mView : super.getView(); + return super.getView() == null ? view : super.getView(); } @Override @@ -359,7 +426,7 @@ public void onClick(View v) { * @return True when the fragment was created with the empty layout. */ public boolean isEmpty() { - return (mLayout == R.layout.file_details_empty || getFile() == null || mAccount == null); + return (layout == R.layout.file_details_empty || getFile() == null || account == null); } @@ -370,7 +437,7 @@ public boolean isEmpty() { */ public void updateFileDetails(OCFile file, Account ocAccount) { setFile(file); - mAccount = ocAccount; + account = ocAccount; updateFileDetails(false, false); } @@ -413,8 +480,8 @@ public void updateFileDetails(boolean transferring, boolean refresh) { FileDownloaderBinder downloaderBinder = mContainerActivity.getFileDownloaderBinder(); FileUploaderBinder uploaderBinder = mContainerActivity.getFileUploaderBinder(); if (transferring || - (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file)) || - (uploaderBinder != null && uploaderBinder.isUploading(mAccount, file)) + (downloaderBinder != null && downloaderBinder.isDownloading(account, file)) || + (uploaderBinder != null && uploaderBinder.isUploading(account, file)) ) { setButtonsForTransferring(); @@ -440,7 +507,7 @@ public void updateFileDetails(boolean transferring, boolean refresh) { * @return 'True' when the fragment is ready to show details of a file */ private boolean readyToShow() { - return (getFile() != null && mAccount != null && mLayout == R.layout.file_details_fragment); + return (getFile() != null && account != null && layout == R.layout.file_details_fragment); } @@ -466,7 +533,7 @@ private void setFiletype(OCFile file) { if (iv != null) { iv.setTag(file.getFileId()); // Name of the file, to deduce the icon to use in case the MIME type is not precise enough - iv.setImageDrawable(MimeTypeUtil.getFileTypeIcon(file.getMimetype(), file.getFileName(), mAccount, + iv.setImageDrawable(MimeTypeUtil.getFileTypeIcon(file.getMimetype(), file.getFileName(), account, getContext())); Bitmap thumbnail; @@ -482,7 +549,7 @@ private void setFiletype(OCFile file) { if (ThumbnailsCacheManager.cancelPotentialThumbnailWork(file, iv)) { final ThumbnailsCacheManager.ThumbnailGenerationTask task = new ThumbnailsCacheManager.ThumbnailGenerationTask( - iv, mContainerActivity.getStorageManager(), mAccount + iv, mContainerActivity.getStorageManager(), account ); if (thumbnail == null) { thumbnail = ThumbnailsCacheManager.mDefaultImg; @@ -498,7 +565,7 @@ private void setFiletype(OCFile file) { } } } else { - iv.setImageDrawable(MimeTypeUtil.getFileTypeIcon(file.getMimetype(), file.getFileName(), mAccount, + iv.setImageDrawable(MimeTypeUtil.getFileTypeIcon(file.getMimetype(), file.getFileName(), account, getContext())); } } @@ -552,8 +619,8 @@ private void setShareWithUserInfo(){ // Get Users and Groups if (((FileActivity) getActivity()).getStorageManager() != null) { FileDataStorageManager fileDataStorageManager = ((FileActivity) getActivity()).getStorageManager(); - mShares = fileDataStorageManager.getSharesWithForAFile( - getFile().getRemotePath(),mAccount.name + shares = fileDataStorageManager.getSharesWithForAFile( + getFile().getRemotePath(), account.name ); // Update list of users/groups @@ -566,7 +633,7 @@ private void updateListOfUserGroups() { // TODO Refactoring: create a new {@link ShareUserListAdapter} instance with every call should not be needed UserListAdapter mUserGroupsAdapter = new UserListAdapter( getActivity().getApplicationContext(), - R.layout.share_user_item, mShares + R.layout.share_user_item, shares ); // Show data @@ -575,7 +642,7 @@ private void updateListOfUserGroups() { // No data TextView noList = getView().findViewById(R.id.fdShareNoUsers); - if (mShares.size() > 0) { + if (shares.size() > 0) { usersList.setVisibility(View.VISIBLE); usersList.setAdapter(mUserGroupsAdapter); noList.setVisibility(View.GONE); @@ -624,11 +691,11 @@ private void setButtonsForTransferring() { FileDownloaderBinder downloaderBinder = mContainerActivity.getFileDownloaderBinder(); FileUploaderBinder uploaderBinder = mContainerActivity.getFileUploaderBinder(); //if (getFile().isDownloading()) { - if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, getFile())) { + if (downloaderBinder != null && downloaderBinder.isDownloading(account, getFile())) { progressText.setText(R.string.downloader_download_in_progress_ticker); } else { - if (uploaderBinder != null && uploaderBinder.isUploading(mAccount, getFile())) { + if (uploaderBinder != null && uploaderBinder.isUploading(account, getFile())) { progressText.setText(R.string.uploader_upload_in_progress_ticker); } } @@ -661,30 +728,30 @@ private void setButtonsForRemote() { public void listenForTransferProgress() { - if (mProgressListener != null) { + if (progressListener != null) { if (mContainerActivity.getFileDownloaderBinder() != null) { mContainerActivity.getFileDownloaderBinder(). - addDatatransferProgressListener(mProgressListener, mAccount, getFile()); + addDatatransferProgressListener(progressListener, account, getFile()); } if (mContainerActivity.getFileUploaderBinder() != null) { mContainerActivity.getFileUploaderBinder(). - addDatatransferProgressListener(mProgressListener, mAccount, getFile()); + addDatatransferProgressListener(progressListener, account, getFile()); } } else { - Log_OC.d(TAG, "mProgressListener == null"); + Log_OC.d(TAG, "progressListener == null"); } } public void leaveTransferProgress() { - if (mProgressListener != null) { + if (progressListener != null) { if (mContainerActivity.getFileDownloaderBinder() != null) { mContainerActivity.getFileDownloaderBinder(). - removeDatatransferProgressListener(mProgressListener, mAccount, getFile()); + removeDatatransferProgressListener(progressListener, account, getFile()); } if (mContainerActivity.getFileUploaderBinder() != null) { mContainerActivity.getFileUploaderBinder(). - removeDatatransferProgressListener(mProgressListener, mAccount, getFile()); + removeDatatransferProgressListener(progressListener, account, getFile()); } } } diff --git a/src/main/res/layout/file_details_fragment.xml b/src/main/res/layout/file_details_fragment.xml index 2c0ce2d6328d..a1e586d38bd1 100644 --- a/src/main/res/layout/file_details_fragment.xml +++ b/src/main/res/layout/file_details_fragment.xml @@ -18,7 +18,6 @@ along with this program. If not, see . --> + + + + + + + + + + \ No newline at end of file diff --git a/src/main/res/layout/toolbar_standard.xml b/src/main/res/layout/toolbar_standard.xml index 3fbecfd3c868..470d829fb92a 100644 --- a/src/main/res/layout/toolbar_standard.xml +++ b/src/main/res/layout/toolbar_standard.xml @@ -19,32 +19,47 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . --> - - - - + android:layout_height="wrap_content"> + + + + + + + + + + + \ No newline at end of file From ca7e60b9ea4cd1adbcca8c7d8730e77e51d2744a Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Fri, 4 May 2018 12:14:57 +0200 Subject: [PATCH 12/27] codacy: combined nested if statements --- .../ui/fragment/FileDetailFragment.java | 76 +++++++++---------- 1 file changed, 37 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index b605ae2aad11..9864d151d851 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -185,48 +185,46 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, } private void setHeaderImage() { - if (mContainerActivity.getStorageManager().getCapability(account.name).getServerBackground() != null) { - - if (previewImage != null) { - - String background = mContainerActivity.getStorageManager().getCapability(account.name).getServerBackground(); - - int primaryColor = ThemeUtils.primaryColor(account, getContext()); - - if (URLUtil.isValidUrl(background)) { - // background image - SimpleTarget target = new SimpleTarget() { - @Override - public void onResourceReady(Drawable resource, GlideAnimation glideAnimation) { - Drawable[] drawables = {new ColorDrawable(primaryColor), resource}; - LayerDrawable layerDrawable = new LayerDrawable(drawables); - previewImage.setImageDrawable(layerDrawable); - previewImage.setVisibility(View.VISIBLE); - ((ToolbarActivity)getActivity()).getSupportActionBar().setTitle(null); - ((ToolbarActivity)getActivity()).getSupportActionBar().setBackgroundDrawable(null); - previewLoaded = true; - } + if (mContainerActivity.getStorageManager().getCapability(account.name) + .getServerBackground() != null && previewImage != null) { + + String background = mContainerActivity.getStorageManager().getCapability(account.name).getServerBackground(); + + int primaryColor = ThemeUtils.primaryColor(account, getContext()); + + if (URLUtil.isValidUrl(background)) { + // background image + SimpleTarget target = new SimpleTarget() { + @Override + public void onResourceReady(Drawable resource, GlideAnimation glideAnimation) { + Drawable[] drawables = {new ColorDrawable(primaryColor), resource}; + LayerDrawable layerDrawable = new LayerDrawable(drawables); + previewImage.setImageDrawable(layerDrawable); + previewImage.setVisibility(View.VISIBLE); + ((ToolbarActivity) getActivity()).getSupportActionBar().setTitle(null); + ((ToolbarActivity) getActivity()).getSupportActionBar().setBackgroundDrawable(null); + previewLoaded = true; + } - @Override - public void onLoadFailed(Exception e, Drawable errorDrawable) { - previewImage.setVisibility(View.GONE); - } - }; - - Glide.with(this) - .load(background) - .centerCrop() - .placeholder(R.drawable.background) - .error(R.drawable.background) - .crossFade() - .into(target); - } else { - // hide image - previewImage.setVisibility(View.GONE); - } + @Override + public void onLoadFailed(Exception e, Drawable errorDrawable) { + previewImage.setVisibility(View.GONE); + } + }; + + Glide.with(this) + .load(background) + .centerCrop() + .placeholder(R.drawable.background) + .error(R.drawable.background) + .crossFade() + .into(target); + } else { + // hide image + previewImage.setVisibility(View.GONE); } } - } +} public void onOverflowIconClicked(View view) { PopupMenu popup = new PopupMenu(getActivity(), view); From 0a8822a76777c07b138e6cfa217552eaeb7b0b14 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Fri, 4 May 2018 13:37:02 +0200 Subject: [PATCH 13/27] load resized image in header Signed-off-by: tobiasKaminsky --- .../datamodel/ThumbnailsCacheManager.java | 15 ++++-- .../ui/fragment/FileDetailFragment.java | 46 ++++++++++++------- 2 files changed, 39 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java b/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java index 1c61db27147e..756471e553cb 100644 --- a/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java +++ b/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java @@ -56,6 +56,7 @@ import com.owncloud.android.lib.resources.status.OwnCloudVersion; import com.owncloud.android.ui.TextDrawable; import com.owncloud.android.ui.adapter.DiskLruImageCache; +import com.owncloud.android.ui.fragment.FileFragment; import com.owncloud.android.ui.preview.PreviewImageFragment; import com.owncloud.android.utils.BitmapUtils; import com.owncloud.android.utils.ConnectivityUtils; @@ -208,17 +209,17 @@ public static Bitmap getBitmapFromDiskCache(String key) { } public static class ResizedImageGenerationTask extends AsyncTask { - private PreviewImageFragment previewImageFragment; + private FileFragment fileFragment; private FileDataStorageManager storageManager; private Account account; private WeakReference imageViewReference; private OCFile file; - public ResizedImageGenerationTask(PreviewImageFragment previewImageFragment, ImageView imageView, + public ResizedImageGenerationTask(FileFragment fileFragment, ImageView imageView, FileDataStorageManager storageManager, Account account) throws IllegalArgumentException { - this.previewImageFragment = previewImageFragment; + this.fileFragment = fileFragment; imageViewReference = new WeakReference<>(imageView); this.storageManager = storageManager; this.account = account; @@ -350,9 +351,13 @@ protected void onPostExecute(Bitmap bitmap) { } else { new Thread(() -> { if (ConnectivityUtils.isInternetWalled(MainApp.getAppContext())) { - previewImageFragment.setNoConnectionErrorMessage(); + if (fileFragment instanceof PreviewImageFragment) { + ((PreviewImageFragment) fileFragment).setNoConnectionErrorMessage(); + } } else { - previewImageFragment.setErrorPreviewMessage(); + if (fileFragment instanceof PreviewImageFragment) { + ((PreviewImageFragment) fileFragment).setErrorPreviewMessage(); + } } }).start(); diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index 9864d151d851..2dc0878428be 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -534,32 +534,44 @@ private void setFiletype(OCFile file) { iv.setImageDrawable(MimeTypeUtil.getFileTypeIcon(file.getMimetype(), file.getFileName(), account, getContext())); - Bitmap thumbnail; + Bitmap resizedImage; if (MimeTypeUtil.isImage(file)) { - String tagId = String.valueOf(file.getRemoteId()); - thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(tagId); + String tagId = String.valueOf(ThumbnailsCacheManager.PREFIX_RESIZED_IMAGE + getFile().getRemoteId()); + resizedImage = ThumbnailsCacheManager.getBitmapFromDiskCache(tagId); - if (thumbnail != null && !file.needsUpdateThumbnail()) { - iv.setImageBitmap(thumbnail); + if (resizedImage != null && !file.needsUpdateThumbnail()) { + iv.setImageBitmap(resizedImage); } else { - // generate new Thumbnail - if (ThumbnailsCacheManager.cancelPotentialThumbnailWork(file, iv)) { - final ThumbnailsCacheManager.ThumbnailGenerationTask task = - new ThumbnailsCacheManager.ThumbnailGenerationTask( - iv, mContainerActivity.getStorageManager(), account - ); - if (thumbnail == null) { - thumbnail = ThumbnailsCacheManager.mDefaultImg; + // show thumbnail while loading resized image + Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache( + String.valueOf(ThumbnailsCacheManager.PREFIX_THUMBNAIL + getFile().getRemoteId())); + + if (thumbnail != null) { + iv.setImageBitmap(thumbnail); + } else { + thumbnail = ThumbnailsCacheManager.mDefaultImg; + } + + // generate new resized image + if (ThumbnailsCacheManager.cancelPotentialThumbnailWork(getFile(), iv) && + mContainerActivity.getStorageManager() != null) { + final ThumbnailsCacheManager.ResizedImageGenerationTask task = + new ThumbnailsCacheManager.ResizedImageGenerationTask(FileDetailFragment.this, + iv, + mContainerActivity.getStorageManager(), + mContainerActivity.getStorageManager().getAccount()); + if (resizedImage == null) { + resizedImage = thumbnail; } - final ThumbnailsCacheManager.AsyncThumbnailDrawable asyncDrawable = - new ThumbnailsCacheManager.AsyncThumbnailDrawable( + final ThumbnailsCacheManager.AsyncResizedImageDrawable asyncDrawable = + new ThumbnailsCacheManager.AsyncResizedImageDrawable( MainApp.getAppContext().getResources(), - thumbnail, + resizedImage, task ); iv.setImageDrawable(asyncDrawable); - task.execute(new ThumbnailsCacheManager.ThumbnailGenerationTaskObject(file, file.getRemoteId())); + task.execute(getFile()); } } } else { From 60a497a9af942520219b1c85c1dd792cedb6019d Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Fri, 4 May 2018 14:54:49 +0200 Subject: [PATCH 14/27] load center cropped preview image, hide type icon --- .../ui/fragment/FileDetailFragment.java | 42 +++++++++++++++++-- src/main/res/layout/file_details_fragment.xml | 1 + src/main/res/layout/toolbar_standard.xml | 18 +++----- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index 2dc0878428be..0fcee4a96e53 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -26,6 +26,7 @@ import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; +import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.design.widget.Snackbar; @@ -83,6 +84,7 @@ public class FileDetailFragment extends FileFragment implements OnClickListener private int layout; private View view; private ImageView previewImage; + private ProgressBar toolbarProgressBar; private boolean previewLoaded; private Account account; @@ -139,10 +141,18 @@ public void onResume() { } if (previewImage != null && MimeTypeUtil.isImage(getFile()) && previewLoaded) { - previewImage.setVisibility(View.VISIBLE); + activatePreviewImage(); } } + private void activatePreviewImage() { + previewImage.setVisibility(View.VISIBLE); + toolbarProgressBar.setVisibility(View.GONE); + ((ToolbarActivity) getActivity()).getSupportActionBar().setTitle(null); + ((ToolbarActivity) getActivity()).getSupportActionBar().setBackgroundDrawable(null); + makeStatusBarBlack(); + } + @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); @@ -161,6 +171,8 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, account = savedInstanceState.getParcelable(FileActivity.EXTRA_ACCOUNT); } + toolbarProgressBar = getActivity().findViewById(R.id.progressBar); + if (getFile() != null && account != null) { layout = R.layout.file_details_fragment; } @@ -176,7 +188,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, view.findViewById(R.id.overflow_menu).setOnClickListener(this); previewImage = getActivity().findViewById(R.id.preview_image); if (getFile() != null && account != null && MimeTypeUtil.isImage(getFile())) { - setHeaderImage(); + //setHeaderImage(); } } @@ -203,12 +215,14 @@ public void onResourceReady(Drawable resource, GlideAnimation glideAnimation) { previewImage.setVisibility(View.VISIBLE); ((ToolbarActivity) getActivity()).getSupportActionBar().setTitle(null); ((ToolbarActivity) getActivity()).getSupportActionBar().setBackgroundDrawable(null); + toolbarProgressBar.setVisibility(View.GONE); previewLoaded = true; } @Override public void onLoadFailed(Exception e, Drawable errorDrawable) { previewImage.setVisibility(View.GONE); + toolbarProgressBar.setVisibility(View.VISIBLE); } }; @@ -222,6 +236,7 @@ public void onLoadFailed(Exception e, Drawable errorDrawable) { } else { // hide image previewImage.setVisibility(View.GONE); + toolbarProgressBar.setVisibility(View.VISIBLE); } } } @@ -287,6 +302,10 @@ public void onStop() { leaveTransferProgress(); if (previewImage != null) { previewImage.setVisibility(View.GONE); + toolbarProgressBar.setVisibility(View.VISIBLE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + getActivity().getWindow().setStatusBarColor(ThemeUtils.primaryDarkColor(getContext())); + } } super.onStop(); @@ -527,6 +546,7 @@ private void setFilename(String filename) { */ private void setFiletype(OCFile file) { ImageView iv = getView().findViewById(R.id.fdIcon); + View v = getView().findViewById(R.id.fdIcon_divider); if (iv != null) { iv.setTag(file.getFileId()); @@ -541,7 +561,11 @@ private void setFiletype(OCFile file) { resizedImage = ThumbnailsCacheManager.getBitmapFromDiskCache(tagId); if (resizedImage != null && !file.needsUpdateThumbnail()) { - iv.setImageBitmap(resizedImage); + iv.setVisibility(View.GONE); + v.setVisibility(View.GONE); + previewImage.setImageBitmap(resizedImage); + activatePreviewImage(); + previewLoaded = true; } else { // show thumbnail while loading resized image Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache( @@ -570,7 +594,11 @@ private void setFiletype(OCFile file) { resizedImage, task ); - iv.setImageDrawable(asyncDrawable); + iv.setVisibility(View.GONE); + v.setVisibility(View.GONE); + previewImage.setImageBitmap(resizedImage); + activatePreviewImage(); + previewLoaded = true; task.execute(getFile()); } } @@ -581,6 +609,12 @@ private void setFiletype(OCFile file) { } } + private void makeStatusBarBlack() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + getActivity().getWindow().setStatusBarColor(getResources().getColor(R.color.black)); + } + } + /** * Updates the file size in view * diff --git a/src/main/res/layout/file_details_fragment.xml b/src/main/res/layout/file_details_fragment.xml index a1e586d38bd1..b6636c2d24da 100644 --- a/src/main/res/layout/file_details_fragment.xml +++ b/src/main/res/layout/file_details_fragment.xml @@ -38,6 +38,7 @@ android:src="@drawable/file" /> diff --git a/src/main/res/layout/toolbar_standard.xml b/src/main/res/layout/toolbar_standard.xml index 470d829fb92a..006044f79563 100644 --- a/src/main/res/layout/toolbar_standard.xml +++ b/src/main/res/layout/toolbar_standard.xml @@ -34,32 +34,26 @@ android:id="@+id/preview_image" android:layout_width="match_parent" android:layout_height="@dimen/nav_drawer_header_height" - android:visibility="gone"/> + android:scaleType="centerCrop" + android:visibility="gone" /> - - + app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> - - + android:visibility="visible" /> - \ No newline at end of file + From 941f621fcc53c40d5a1b8e57a0b23810f430c5b0 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Fri, 4 May 2018 15:24:41 +0200 Subject: [PATCH 15/27] implement set available offline via menu --- .../android/ui/fragment/FileDetailFragment.java | 16 +++++++++++----- .../android/ui/helpers/FileOperationsHelper.java | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index 0fcee4a96e53..99bc060774a2 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -325,8 +325,6 @@ public void onPrepareOptionsMenu(Menu menu) { } private void prepareOptionsMenu(Menu menu) { - super.onPrepareOptionsMenu(menu); - if (mContainerActivity.getStorageManager() != null) { FileMenuFilter mf = new FileMenuFilter( getFile(), @@ -401,6 +399,14 @@ public boolean optionsItemSelected(MenuItem item) { mContainerActivity.getFileOperationsHelper().syncFile(getFile()); return true; } + case R.id.action_keep_files_offline: { + mContainerActivity.getFileOperationsHelper().toggleOfflineFile(getFile(), true); + return true; + } + case R.id.action_unset_keep_files_offline: { + mContainerActivity.getFileOperationsHelper().toggleOfflineFile(getFile(), false); + return true; + } default: return super.onOptionsItemSelected(item); } @@ -418,18 +424,18 @@ public void onClick(View v) { ((ImageView)getView().findViewById(R.id.fdFavorite)). setImageDrawable(getResources() .getDrawable(R.drawable.ic_star_outline)); + mContainerActivity.getFileOperationsHelper().toggleFavoriteFile(getFile(), false); } else { ((ImageView)getView().findViewById(R.id.fdFavorite)) .setImageDrawable(getResources() .getDrawable(R.drawable.ic_star)); + mContainerActivity.getFileOperationsHelper().toggleFavoriteFile(getFile(), true); } - - mContainerActivity.getFileOperationsHelper() - .toggleOfflineFile(getFile(), !getFile().isAvailableOffline()); break; } case R.id.overflow_menu: { onOverflowIconClicked(v); + break; } default: Log_OC.e(TAG, "Incorrect view clicked!"); diff --git a/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java b/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java index 5d7e0a5bad03..0ba7ae18d8c2 100755 --- a/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java +++ b/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java @@ -728,7 +728,7 @@ public void toggleFavoriteFiles(Collection files, boolean shouldBeFavori } } - private void toggleFavoriteFile(OCFile file, boolean shouldBeFavorite) { + public void toggleFavoriteFile(OCFile file, boolean shouldBeFavorite) { if (file.getIsFavorite() != shouldBeFavorite) { EventBus.getDefault().post(new FavoriteEvent(file.getRemotePath(), shouldBeFavorite, file.getRemoteId())); } From 57e061ed8dadce3b5d8e3e566931fde691ab1e79 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Fri, 4 May 2018 15:28:04 +0200 Subject: [PATCH 16/27] uncomment unused method/calls for use whenever we switch to glide --- .../android/ui/fragment/FileDetailFragment.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index 99bc060774a2..d1d40397d3d5 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -187,15 +187,19 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, view.findViewById(R.id.fdFavorite).setOnClickListener(this); view.findViewById(R.id.overflow_menu).setOnClickListener(this); previewImage = getActivity().findViewById(R.id.preview_image); + // TODO use whenever we switch to use glide for preview images + /* if (getFile() != null && account != null && MimeTypeUtil.isImage(getFile())) { - //setHeaderImage(); + setHeaderImage(); } + */ } updateFileDetails(false, false); return view; } - + // TODO use whenever we switch to use glide for preview images + /* private void setHeaderImage() { if (mContainerActivity.getStorageManager().getCapability(account.name) .getServerBackground() != null && previewImage != null) { @@ -239,7 +243,8 @@ public void onLoadFailed(Exception e, Drawable errorDrawable) { toolbarProgressBar.setVisibility(View.VISIBLE); } } -} + } + */ public void onOverflowIconClicked(View view) { PopupMenu popup = new PopupMenu(getActivity(), view); From adb9ab24efa8046af09ee080f8621e33bbd03eb8 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Fri, 4 May 2018 18:10:25 +0200 Subject: [PATCH 17/27] cleanup details fragment, use standard character avatars for sharees instead of grey icons (just for iteration 1) --- .../android/ui/adapter/UserListAdapter.java | 28 +++- .../ui/fragment/FileDetailFragment.java | 111 +-------------- .../layout/file_details_share_user_item.xml | 14 +- .../layout/file_details_sharing_fragment.xml | 132 +++++++++--------- 4 files changed, 103 insertions(+), 182 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/adapter/UserListAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/UserListAdapter.java index 0f321248f5c1..6d7d120fbede 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/UserListAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/UserListAdapter.java @@ -32,7 +32,10 @@ import com.owncloud.android.R; import com.owncloud.android.lib.resources.shares.OCShare; import com.owncloud.android.lib.resources.shares.ShareType; +import com.owncloud.android.ui.TextDrawable; +import java.io.UnsupportedEncodingException; +import java.security.NoSuchAlgorithmException; import java.util.ArrayList; /** @@ -42,11 +45,14 @@ public class UserListAdapter extends ArrayAdapter { private Context mContext; private ArrayList mShares; + private float mAvatarRadiusDimension; public UserListAdapter(Context context, int resource, ArrayList shares) { super(context, resource); mContext = context; mShares = shares; + + mAvatarRadiusDimension = context.getResources().getDimension(R.dimen.standard_padding); } @Override @@ -75,15 +81,29 @@ public long getItemId(int position) { if (mShares != null && mShares.size() > position) { OCShare share = mShares.get(position); - TextView userName = (TextView) view.findViewById(R.id.userOrGroupName); - ImageView icon = (ImageView) view.findViewById(R.id.userIcon); + TextView userName = view.findViewById(R.id.userOrGroupName); + ImageView icon = view.findViewById(R.id.userIcon); String name = share.getSharedWithDisplayName(); if (share.getShareType() == ShareType.GROUP) { name = getContext().getString(R.string.share_group_clarification, name); - icon.setImageResource(R.drawable.ic_group); + try { + icon.setImageDrawable(TextDrawable.createNamedAvatar(name, mAvatarRadiusDimension)); + } catch (UnsupportedEncodingException | NoSuchAlgorithmException e) { + icon.setImageResource(R.drawable.ic_group); + } } else if (share.getShareType() == ShareType.EMAIL) { name = getContext().getString(R.string.share_email_clarification, name); - icon.setImageResource(R.drawable.ic_email); + try { + icon.setImageDrawable(TextDrawable.createNamedAvatar(name, mAvatarRadiusDimension)); + } catch (UnsupportedEncodingException | NoSuchAlgorithmException e) { + icon.setImageResource(R.drawable.ic_email); + } + } else { + try { + icon.setImageDrawable(TextDrawable.createNamedAvatar(name, mAvatarRadiusDimension)); + } catch (UnsupportedEncodingException | NoSuchAlgorithmException e) { + icon.setImageResource(R.drawable.ic_user); + } } userName.setText(name); diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index d1d40397d3d5..e8120f7a83c2 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -23,9 +23,6 @@ import android.accounts.Account; import android.graphics.Bitmap; -import android.graphics.drawable.ColorDrawable; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.LayerDrawable; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; @@ -38,17 +35,11 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; -import android.webkit.URLUtil; import android.widget.ImageView; -import android.widget.ListAdapter; -import android.widget.ListView; import android.widget.PopupMenu; import android.widget.ProgressBar; import android.widget.TextView; -import com.bumptech.glide.Glide; -import com.bumptech.glide.request.animation.GlideAnimation; -import com.bumptech.glide.request.target.SimpleTarget; import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.FileDataStorageManager; @@ -59,12 +50,10 @@ import com.owncloud.android.files.services.FileUploader.FileUploaderBinder; import com.owncloud.android.lib.common.network.OnDatatransferProgressListener; import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.lib.resources.shares.OCShare; import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.activity.FileDisplayActivity; import com.owncloud.android.ui.activity.ToolbarActivity; import com.owncloud.android.ui.adapter.FileDetailTabAdapter; -import com.owncloud.android.ui.adapter.UserListAdapter; import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment; import com.owncloud.android.ui.dialog.RenameFileDialogFragment; import com.owncloud.android.utils.AnalyticsUtils; @@ -73,7 +62,6 @@ import com.owncloud.android.utils.ThemeUtils; import java.lang.ref.WeakReference; -import java.util.ArrayList; /** @@ -90,9 +78,6 @@ public class FileDetailFragment extends FileFragment implements OnClickListener public ProgressListener progressListener; - // to show share with users/groups info - private ArrayList shares; - private static final String TAG = FileDetailFragment.class.getSimpleName(); public static final String FTAG_CONFIRMATION = "REMOVE_CONFIRMATION_FRAGMENT"; public static final String FTAG_RENAME_FILE = "RENAME_FILE_FRAGMENT"; @@ -316,7 +301,6 @@ public void onStop() { super.onStop(); } - @Override public View getView() { return super.getView() == null ? view : super.getView(); @@ -457,7 +441,6 @@ public boolean isEmpty() { return (layout == R.layout.file_details_empty || getFile() == null || account == null); } - /** * Use this method to signal this Activity that it shall update its view. * @@ -471,7 +454,7 @@ public void updateFileDetails(OCFile file, Account ocAccount) { /** * Updates the view with all relevant details about that file. - *

+ * * TODO Remove parameter when the transferring state of files is kept in database. * * @param transferring Flag signaling if the file should be considered as downloading or uploading, @@ -538,7 +521,6 @@ private boolean readyToShow() { return (getFile() != null && account != null && layout == R.layout.file_details_fragment); } - /** * Updates the filename in view * @@ -650,90 +632,6 @@ private void setTimeModified(long milliseconds) { } } - /** - * Updates Share by link data - * - * @param isShareByLink flag is share by link is enable - */ - private void setShareByLinkInfo(boolean isShareByLink) { - TextView tv = getView().findViewById(R.id.fdSharebyLink); - if (tv != null) { - tv.setText(isShareByLink ? R.string.filedetails_share_link_enable : - R.string.filedetails_share_link_disable); - } - ImageView linkIcon = getView().findViewById(R.id.fdShareLinkIcon); - if (linkIcon != null) { - linkIcon.setVisibility(isShareByLink ? View.VISIBLE : View.GONE); - } - } - - /** - * Update Share With data - */ - private void setShareWithUserInfo(){ - // Get Users and Groups - if (((FileActivity) getActivity()).getStorageManager() != null) { - FileDataStorageManager fileDataStorageManager = ((FileActivity) getActivity()).getStorageManager(); - shares = fileDataStorageManager.getSharesWithForAFile( - getFile().getRemotePath(), account.name - ); - - // Update list of users/groups - updateListOfUserGroups(); - } - } - - private void updateListOfUserGroups() { - // Update list of users/groups - // TODO Refactoring: create a new {@link ShareUserListAdapter} instance with every call should not be needed - UserListAdapter mUserGroupsAdapter = new UserListAdapter( - getActivity().getApplicationContext(), - R.layout.share_user_item, shares - ); - - // Show data - ListView usersList = getView().findViewById(R.id.fdshareUsersList); - - // No data - TextView noList = getView().findViewById(R.id.fdShareNoUsers); - - if (shares.size() > 0) { - usersList.setVisibility(View.VISIBLE); - usersList.setAdapter(mUserGroupsAdapter); - noList.setVisibility(View.GONE); - setListViewHeightBasedOnChildren(usersList); - - } else { - usersList.setVisibility(View.GONE); - noList.setVisibility(View.VISIBLE); - } - } - - /** - * Fix scroll in listview when the parent is a ScrollView - */ - private static void setListViewHeightBasedOnChildren(ListView listView) { - ListAdapter listAdapter = listView.getAdapter(); - if (listAdapter == null) { - return; - } - int desiredWidth = View.MeasureSpec.makeMeasureSpec(listView.getWidth(), View.MeasureSpec.AT_MOST); - int totalHeight = 0; - View view = null; - for (int i = 0; i < listAdapter.getCount(); i++) { - view = listAdapter.getView(i, view, listView); - if (i == 0) { - view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, ViewGroup.LayoutParams.WRAP_CONTENT)); - } - view.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED); - totalHeight += view.getMeasuredHeight(); - } - ViewGroup.LayoutParams params = listView.getLayoutParams(); - params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); - listView.setLayoutParams(params); - listView.requestLayout(); - } - /** * Enables or disables buttons for a file being downloaded */ @@ -781,7 +679,6 @@ private void setButtonsForRemote() { } } - public void listenForTransferProgress() { if (progressListener != null) { if (mContainerActivity.getFileDownloaderBinder() != null) { @@ -797,7 +694,6 @@ public void listenForTransferProgress() { } } - public void leaveTransferProgress() { if (progressListener != null) { if (mContainerActivity.getFileDownloaderBinder() != null) { @@ -811,14 +707,13 @@ public void leaveTransferProgress() { } } - /** * Helper class responsible for updating the progress bar shown for file uploading or * downloading */ private class ProgressListener implements OnDatatransferProgressListener { int mLastPercent = 0; - WeakReference mProgressBar = null; + WeakReference mProgressBar; ProgressListener(ProgressBar progressBar) { mProgressBar = new WeakReference(progressBar); @@ -837,7 +732,5 @@ public void onTransferProgress(long progressRate, long totalTransferredSoFar, } mLastPercent = percent; } - } - } diff --git a/src/main/res/layout/file_details_share_user_item.xml b/src/main/res/layout/file_details_share_user_item.xml index 159f936d35ad..616c432dba60 100644 --- a/src/main/res/layout/file_details_share_user_item.xml +++ b/src/main/res/layout/file_details_share_user_item.xml @@ -21,6 +21,8 @@ android:layout_height="wrap_content" android:orientation="horizontal" android:weightSum="1" + android:paddingTop="@dimen/standard_eigth_padding" + android:paddingBottom="@dimen/standard_eigth_padding" tools:ignore="UseCompoundDrawables"> diff --git a/src/main/res/layout/file_details_sharing_fragment.xml b/src/main/res/layout/file_details_sharing_fragment.xml index 20ac0b91a6c3..ace16c377294 100644 --- a/src/main/res/layout/file_details_sharing_fragment.xml +++ b/src/main/res/layout/file_details_sharing_fragment.xml @@ -17,89 +17,87 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . --> - - + android:layout_weight="1"> - + android:layout_height="wrap_content" + android:orientation="vertical" + android:paddingTop="@dimen/standard_padding"> - - - + android:paddingLeft="@dimen/standard_padding" + android:paddingRight="@dimen/standard_padding" + android:text="@string/action_send_share" + android:textColor="@color/color_accent" /> - - - - - - + + + + android:text="@string/filedetails_share_link_disable" /> + - + - + - + - + - + From 5934bbfe9a4ecb15bca1d77d10e6710db9198600 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Fri, 4 May 2018 18:29:15 +0200 Subject: [PATCH 18/27] also use standard character avatars for sharees instead of grey icons (just for iteration 1, soon tobe replaces by the new details&sharing implementation) --- .../ui/adapter/ShareUserListAdapter.java | 47 ++++++++++++++----- src/main/res/layout/share_user_item.xml | 10 ++-- 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/adapter/ShareUserListAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/ShareUserListAdapter.java index 17168192aab0..88d82b22fd3d 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/ShareUserListAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/ShareUserListAdapter.java @@ -22,6 +22,7 @@ import android.content.Context; import android.graphics.drawable.Drawable; +import android.support.annotation.NonNull; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -32,7 +33,10 @@ import com.owncloud.android.R; import com.owncloud.android.lib.resources.shares.OCShare; import com.owncloud.android.lib.resources.shares.ShareType; +import com.owncloud.android.ui.TextDrawable; +import java.io.UnsupportedEncodingException; +import java.security.NoSuchAlgorithmException; import java.util.ArrayList; /** @@ -43,6 +47,7 @@ public class ShareUserListAdapter extends ArrayAdapter { private Context mContext; private ArrayList mShares; private ShareUserAdapterListener mListener; + private float mAvatarRadiusDimension; public ShareUserListAdapter(Context context, int resource, ArrayListshares, ShareUserAdapterListener listener) { @@ -50,6 +55,8 @@ public ShareUserListAdapter(Context context, int resource, ArrayListsha mContext= context; mShares = shares; mListener = listener; + + mAvatarRadiusDimension = context.getResources().getDimension(R.dimen.standard_padding); } @Override @@ -67,32 +74,46 @@ public long getItemId(int position) { return 0; } + @NonNull @Override - public View getView(final int position, View convertView, ViewGroup parent) { - LayoutInflater inflator = (LayoutInflater) mContext - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - View view = inflator.inflate(R.layout.share_user_item, parent, false); + public View getView(final int position, View convertView, @NonNull ViewGroup parent) { + View view = convertView; + if (view == null) { + LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + view = inflater.inflate(R.layout.share_user_item, parent, false); + } if (mShares != null && mShares.size() > position) { OCShare share = mShares.get(position); - TextView userName = (TextView) view.findViewById(R.id.userOrGroupName); - ImageView iconView = (ImageView) view.findViewById(R.id.icon); - final ImageView editShareButton = (ImageView) view.findViewById(R.id.editShareButton); - final ImageView unshareButton = (ImageView) view.findViewById(R.id.unshareButton); + TextView userName = view.findViewById(R.id.userOrGroupName); + ImageView icon = view.findViewById(R.id.icon); + final ImageView editShareButton = view.findViewById(R.id.editShareButton); + final ImageView unshareButton = view.findViewById(R.id.unshareButton); String name = share.getSharedWithDisplayName(); - Drawable icon = getContext().getResources().getDrawable(R.drawable.ic_user); if (share.getShareType() == ShareType.GROUP) { name = getContext().getString(R.string.share_group_clarification, name); - icon = getContext().getResources().getDrawable(R.drawable.ic_group); + try { + icon.setImageDrawable(TextDrawable.createNamedAvatar(name, mAvatarRadiusDimension)); + } catch (UnsupportedEncodingException | NoSuchAlgorithmException e) { + icon.setImageResource(R.drawable.ic_group); + } } else if (share.getShareType() == ShareType.EMAIL) { name = getContext().getString(R.string.share_email_clarification, name); - icon = getContext().getResources().getDrawable(R.drawable.ic_email); - editShareButton.setVisibility(View.INVISIBLE); + try { + icon.setImageDrawable(TextDrawable.createNamedAvatar(name, mAvatarRadiusDimension)); + } catch (UnsupportedEncodingException | NoSuchAlgorithmException e) { + icon.setImageResource(R.drawable.ic_email); + } + } else { + try { + icon.setImageDrawable(TextDrawable.createNamedAvatar(name, mAvatarRadiusDimension)); + } catch (UnsupportedEncodingException | NoSuchAlgorithmException e) { + icon.setImageResource(R.drawable.ic_user); + } } userName.setText(name); - iconView.setImageDrawable(icon); /// bind listener to edit privileges editShareButton.setOnClickListener(new View.OnClickListener() { diff --git a/src/main/res/layout/share_user_item.xml b/src/main/res/layout/share_user_item.xml index ed78057db2e0..b111ab02d039 100644 --- a/src/main/res/layout/share_user_item.xml +++ b/src/main/res/layout/share_user_item.xml @@ -27,8 +27,8 @@ android:weightSum="1" android:longClickable="true"> + android:gravity="center_vertical"/> Date: Fri, 4 May 2018 18:32:05 +0200 Subject: [PATCH 19/27] codacy cleanup + fixed javaDoc --- .../owncloud/android/ui/fragment/FileDetailFragment.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index e8120f7a83c2..0c06106ada5b 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -708,15 +708,14 @@ public void leaveTransferProgress() { } /** - * Helper class responsible for updating the progress bar shown for file uploading or - * downloading + * Helper class responsible for updating the progress bar shown for file downloading. */ private class ProgressListener implements OnDatatransferProgressListener { - int mLastPercent = 0; - WeakReference mProgressBar; + private int mLastPercent = 0; + private WeakReference mProgressBar; ProgressListener(ProgressBar progressBar) { - mProgressBar = new WeakReference(progressBar); + mProgressBar = new WeakReference<>(progressBar); } @Override From c7d8171be1ad3245f943cb66a3ebaf3aa6417652 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Fri, 4 May 2018 18:35:06 +0200 Subject: [PATCH 20/27] fix use of asyncDrawable --- .../com/owncloud/android/ui/fragment/FileDetailFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index 0c06106ada5b..9686880d17e5 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -589,7 +589,7 @@ private void setFiletype(OCFile file) { ); iv.setVisibility(View.GONE); v.setVisibility(View.GONE); - previewImage.setImageBitmap(resizedImage); + previewImage.setImageDrawable(asyncDrawable); activatePreviewImage(); previewLoaded = true; task.execute(getFile()); From 7c21f46b8997b269e33e1532ac73de066ec35047 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Fri, 4 May 2018 18:41:40 +0200 Subject: [PATCH 21/27] fix empty activities icon --- .../android/ui/fragment/FileDetailActivitiesFragment.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java index 831426a59b94..58dab16242a2 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java @@ -148,6 +148,8 @@ public void onDestroy() { private void setupView() { FileDataStorageManager storageManager = new FileDataStorageManager(account, getActivity().getContentResolver()); + emptyContentIcon.setImageDrawable(getResources().getDrawable(R.drawable.ic_activity_light_grey)); + adapter = new ActivityListAdapter(getContext(), this, storageManager); recyclerView.setAdapter(adapter); From dc771a8d6756629d84858b6999280096ba5503a5 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Fri, 4 May 2018 18:54:14 +0200 Subject: [PATCH 22/27] implemented pull-to-refresh for activities --- .../FileDetailActivitiesFragment.java | 47 +++++++++++++++++-- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java index 58dab16242a2..bc8c3a93bb46 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java @@ -24,6 +24,7 @@ import android.accounts.AuthenticatorException; import android.accounts.OperationCanceledException; import android.content.Context; +import android.graphics.PorterDuff; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; @@ -53,6 +54,7 @@ import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.adapter.ActivityListAdapter; import com.owncloud.android.ui.interfaces.ActivityListInterface; +import com.owncloud.android.utils.ThemeUtils; import java.io.IOException; import java.util.ArrayList; @@ -135,11 +137,41 @@ public View onCreateView(@NonNull LayoutInflater inflater, unbinder = ButterKnife.bind(this, view); setupView(); + + onCreateSwipeToRefresh(swipeEmptyListRefreshLayout); + onCreateSwipeToRefresh(swipeListRefreshLayout); + fetchAndSetData(null); + swipeListRefreshLayout.setOnRefreshListener(() -> { + setLoadingMessage(); + if (swipeListRefreshLayout != null && swipeListRefreshLayout.isRefreshing()) { + swipeListRefreshLayout.setRefreshing(false); + } + fetchAndSetData(null); + } + ); + + swipeEmptyListRefreshLayout.setOnRefreshListener(() -> { + setLoadingMessage(); + if (swipeEmptyListRefreshLayout != null && swipeEmptyListRefreshLayout.isRefreshing()) { + swipeEmptyListRefreshLayout.setRefreshing(false); + } + fetchAndSetData(null); + } + ); + return view; } + private void setLoadingMessage() { + emptyContentHeadline.setText(R.string.file_list_loading); + emptyContentMessage.setText(""); + + emptyContentIcon.setVisibility(View.GONE); + emptyContentProgressBar.setVisibility(View.VISIBLE); + } + @Override public void onDestroy() { super.onDestroy(); @@ -148,8 +180,10 @@ public void onDestroy() { private void setupView() { FileDataStorageManager storageManager = new FileDataStorageManager(account, getActivity().getContentResolver()); + emptyContentProgressBar.getIndeterminateDrawable().setColorFilter(ThemeUtils.primaryAccentColor(getContext()), + PorterDuff.Mode.SRC_IN); emptyContentIcon.setImageDrawable(getResources().getDrawable(R.drawable.ic_activity_light_grey)); - + adapter = new ActivityListAdapter(getContext(), this, storageManager); recyclerView.setAdapter(adapter); @@ -191,7 +225,6 @@ private void fetchAndSetData(String pageUrl) { getClientFor(ocAccount, MainApp.getAppContext()); ownCloudClient.setOwnCloudVersion(AccountUtils.getServerVersion(currentAccount)); isLoadingActivities = true; - //getActivity().runOnUiThread(() -> setIndeterminate(isLoadingActivities)); GetRemoteActivitiesOperation getRemoteNotificationOperation = new GetRemoteActivitiesOperation( file.getLocalId()); @@ -219,7 +252,6 @@ private void fetchAndSetData(String pageUrl) { swipeEmptyListRefreshLayout.setVisibility(View.VISIBLE); } isLoadingActivities = false; - //setIndeterminate(isLoadingActivities); }); } else { Log_OC.d(TAG, result.getLogMessage()); @@ -279,6 +311,15 @@ private void hideRefreshLayoutLoader() { }); } + protected void onCreateSwipeToRefresh(SwipeRefreshLayout refreshLayout) { + int primaryColor = ThemeUtils.primaryColor(getContext()); + int darkColor = ThemeUtils.primaryDarkColor(getContext()); + int accentColor = ThemeUtils.primaryAccentColor(getContext()); + + // Colors in animations + refreshLayout.setColorSchemeColors(accentColor, primaryColor, darkColor); + } + @Override public void onActivityClicked(RichObject richObject) { // TODO implement activity click From 70a9c9584db9ac7d9191516b352b9c3c818c41dd Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Fri, 4 May 2018 19:00:07 +0200 Subject: [PATCH 23/27] add theming/tinting for sharing headers --- .../android/ui/fragment/FileDetailSharingFragment.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java index f3cc8d7908ce..ccecf47cbb27 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java @@ -38,6 +38,7 @@ import com.owncloud.android.lib.resources.shares.OCShare; import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.adapter.UserListAdapter; +import com.owncloud.android.utils.ThemeUtils; import java.util.ArrayList; @@ -82,7 +83,8 @@ public View onCreateView(@NonNull LayoutInflater inflater, } private void setupView(View view) { - // TODO populate sharing UI + ((TextView)view.findViewById(R.id.fdShareTitle)).setTextColor(ThemeUtils.primaryAccentColor(getContext())); + ((TextView)view.findViewById(R.id.fdShareWithUsersTitle)).setTextColor(ThemeUtils.primaryAccentColor(getContext())); setShareByLinkInfo(file.isSharedViaLink(), view); From e047df0f4a7b81990a01690953d3eead7e4ab83b Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Fri, 4 May 2018 19:08:11 +0200 Subject: [PATCH 24/27] fix theming/tinting for tab indicator --- .../com/owncloud/android/ui/fragment/FileDetailFragment.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index 9686880d17e5..e6e8477ac7ae 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -250,6 +250,7 @@ private void setupViewPager(View view) { tabLayout.addTab(tabLayout.newTab().setText(R.string.share_dialog_title)); tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); + tabLayout.setSelectedTabIndicatorColor(ThemeUtils.primaryAccentColor(getContext())); final ViewPager viewPager = view.findViewById(R.id.pager); final FileDetailTabAdapter adapter = new FileDetailTabAdapter From 1349c2648cf3913669239cfc32c6a7e85e7d1532 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Fri, 4 May 2018 19:18:01 +0200 Subject: [PATCH 25/27] fix lint issues --- src/main/res/layout/log_send_file.xml | 2 +- src/main/res/layout/toolbar_preview.xml | 53 ------------------------- src/main/res/values/dims.xml | 1 - src/main/res/values/strings.xml | 1 - 4 files changed, 1 insertion(+), 56 deletions(-) delete mode 100644 src/main/res/layout/toolbar_preview.xml diff --git a/src/main/res/layout/log_send_file.xml b/src/main/res/layout/log_send_file.xml index 2713ff7d6c7f..12c66558207d 100644 --- a/src/main/res/layout/log_send_file.xml +++ b/src/main/res/layout/log_send_file.xml @@ -28,7 +28,7 @@ diff --git a/src/main/res/layout/toolbar_preview.xml b/src/main/res/layout/toolbar_preview.xml deleted file mode 100644 index e459405c87f7..000000000000 --- a/src/main/res/layout/toolbar_preview.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/res/values/dims.xml b/src/main/res/values/dims.xml index fb1cebc19e7b..f2700b298106 100644 --- a/src/main/res/values/dims.xml +++ b/src/main/res/values/dims.xml @@ -107,7 +107,6 @@ 32dp 32dp 16sp - 12dp 24dp 16dp 16dp diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index e75e4de43c2e..7fc009dd1b5e 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -269,7 +269,6 @@ Unset as available offline Set as favorite Unset favorite - Available offline Set as encrypted Unset encryption Rename From 1049a8a91bba2fb941a2af85d541c6730a9ce938 Mon Sep 17 00:00:00 2001 From: nextcloud-android-bot <> Date: Fri, 4 May 2018 17:22:05 +0000 Subject: [PATCH 26/27] Drone: update Lint results to reflect reduced error/warning count [skip ci] --- scripts/lint/lint-results.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/lint/lint-results.txt b/scripts/lint/lint-results.txt index 0cc0a7f04705..820328a72cc0 100644 --- a/scripts/lint/lint-results.txt +++ b/scripts/lint/lint-results.txt @@ -1,2 +1,2 @@ DO NOT TOUCH; GENERATED BY DRONE - Lint Report: 114 warnings + Lint Report: 113 warnings From 200e5aac0744999565f71821c47c36557d01db17 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Wed, 9 May 2018 11:33:28 +0200 Subject: [PATCH 27/27] center tabs --- src/main/res/layout/file_details_fragment.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/res/layout/file_details_fragment.xml b/src/main/res/layout/file_details_fragment.xml index b6636c2d24da..9804d97e26e7 100644 --- a/src/main/res/layout/file_details_fragment.xml +++ b/src/main/res/layout/file_details_fragment.xml @@ -198,7 +198,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" app:tabGravity="center" - app:tabMode="scrollable" + app:tabMode="fixed" android:background="@color/white" />