remove EditShareFragment.java

Signed-off-by: tobiasKaminsky <tobias@kaminsky.me>
This commit is contained in:
tobiasKaminsky 2020-06-30 09:45:40 +02:00
parent ba62819180
commit f6e8636cfa
No known key found for this signature in database
GPG key ID: 0E00D4D47D0C5AF7
5 changed files with 1 additions and 632 deletions

View file

@ -1 +1 @@
336
335

View file

@ -1,525 +0,0 @@
/*
* ownCloud Android client application
*
* @author masensio
* @author David A. Velasco
* Copyright (C) 2015 ownCloud Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2,
* as published by the Free Software Foundation.
*
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.owncloud.android.ui.fragment;
import android.graphics.PorterDuff;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import com.nextcloud.client.account.User;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.lib.resources.shares.OCShare;
import com.owncloud.android.lib.resources.shares.SharePermissionsBuilder;
import com.owncloud.android.lib.resources.shares.ShareType;
import com.owncloud.android.lib.resources.status.OCCapability;
import com.owncloud.android.ui.activity.FileActivity;
import com.owncloud.android.utils.ThemeUtils;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.AppCompatCheckBox;
import androidx.appcompat.widget.SwitchCompat;
import androidx.fragment.app.Fragment;
public class EditShareFragment extends Fragment {
private static final String TAG = EditShareFragment.class.getSimpleName();
/** The fragment initialization parameters */
private static final String ARG_SHARE = "SHARE";
private static final String ARG_FILE = "FILE";
private static final String ARG_USER = "USER";
/** Ids of CheckBoxes depending on R.id.canEdit CheckBox */
private static final int sSubordinateCheckBoxIds[] = {
R.id.canEditCreateCheckBox,
R.id.canEditChangeCheckBox,
R.id.canEditDeleteCheckBox
};
/** Share to show & edit, received as a parameter in construction time */
private OCShare mShare;
/** File bound to mShare, received as a parameter in construction time */
private OCFile mFile;
/** Account of the shared file, received as a parameter in construction time */
private User user;
/**
* Capabilities of the server.
*/
private OCCapability mCapabilities;
/** Listener for changes on privilege checkboxes */
private CompoundButton.OnCheckedChangeListener mOnPrivilegeChangeListener;
/**
* Public factory method to create new EditShareFragment instances.
*
* @param shareToEdit An {@link OCShare} to show and edit in the fragment
* @param sharedFile The {@link OCFile} bound to 'shareToEdit'
* @param user User holding 'sharedFile'
* @return A new instance of fragment EditShareFragment.
*/
public static EditShareFragment newInstance(OCShare shareToEdit, OCFile sharedFile, User user) {
EditShareFragment fragment = new EditShareFragment();
Bundle args = new Bundle();
args.putParcelable(ARG_SHARE, shareToEdit);
args.putParcelable(ARG_FILE, sharedFile);
args.putParcelable(ARG_USER, user);
fragment.setArguments(args);
return fragment;
}
/**
* {@inheritDoc}
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log_OC.d(TAG, "onCreate");
if (getArguments() != null) {
mShare = getArguments().getParcelable(ARG_SHARE);
mFile = getArguments().getParcelable(ARG_FILE);
/* OC account holding the shared file, received as a parameter in construction time */
user = getArguments().getParcelable(ARG_USER);
}
FileDataStorageManager storageManager = new FileDataStorageManager(user.toPlatformAccount(),
getContext().getContentResolver());
mCapabilities = storageManager.getCapability(user.getAccountName());
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log_OC.d(TAG, "onActivityCreated");
getActivity().setTitle(mShare.getSharedWithDisplayName());
}
/**
* {@inheritDoc}
*/
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log_OC.d(TAG, "onCreateView");
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.edit_share_layout, container, false);
((TextView) view.findViewById(R.id.editShareTitle)).setText(
getResources().getString(R.string.share_with_edit_title, mShare.getSharedWithDisplayName()));
View headerDivider = view.findViewById(R.id.share_header_divider);
headerDivider.getBackground().setColorFilter(ThemeUtils.primaryAccentColor(getContext()),
PorterDuff.Mode.SRC_ATOP);
// Setup layout
refreshUiFromState(view);
return view;
}
/**
* Get known server capabilities from DB
* <p/>
* Depends on the parent Activity provides a {@link com.owncloud.android.datamodel.FileDataStorageManager}
* instance ready to use. If not ready, does nothing.
*/
public void refreshCapabilitiesFromDB() {
if (getActivity() instanceof FileActivity) {
FileActivity fileActivity = (FileActivity) getActivity();
if (fileActivity.getStorageManager() != null) {
mCapabilities = fileActivity.getStorageManager().getCapability(user.getAccountName());
}
}
}
/**
* Updates the UI with the current permissions in the edited {@OCShare}
*
* @param editShareView Root view in the fragment.
*/
private void refreshUiFromState(View editShareView) {
if (editShareView != null) {
setPermissionsListening(editShareView, false);
int sharePermissions = mShare.getPermissions();
boolean isFederated = ShareType.FEDERATED.equals(mShare.getShareType());
int accentColor = ThemeUtils.primaryAccentColor(getContext());
SwitchCompat shareSwitch = editShareView.findViewById(R.id.canShareSwitch);
ThemeUtils.tintSwitch(shareSwitch, accentColor, true);
if (isFederated) {
shareSwitch.setVisibility(View.INVISIBLE);
} else if (mCapabilities != null && mCapabilities.getFilesSharingResharing().isFalse()) {
shareSwitch.setVisibility(View.GONE);
}
shareSwitch.setChecked((sharePermissions & OCShare.SHARE_PERMISSION_FLAG) > 0);
SwitchCompat switchCompat = editShareView.findViewById(R.id.canEditSwitch);
ThemeUtils.tintSwitch(switchCompat, accentColor, true);
int anyUpdatePermission = OCShare.CREATE_PERMISSION_FLAG | OCShare.UPDATE_PERMISSION_FLAG |
OCShare.DELETE_PERMISSION_FLAG;
boolean canEdit = (sharePermissions & anyUpdatePermission) > 0;
switchCompat.setChecked(canEdit);
boolean areEditOptionsAvailable = !isFederated;
if (mFile.isFolder() && areEditOptionsAvailable) {
/// TODO change areEditOptionsAvailable in order to delete !isFederated
// from checking when iOS is ready
AppCompatCheckBox checkBox = editShareView.findViewById(R.id.canEditCreateCheckBox);
checkBox.setChecked((sharePermissions & OCShare.CREATE_PERMISSION_FLAG) > 0);
checkBox.setVisibility(canEdit ? View.VISIBLE : View.GONE);
ThemeUtils.tintCheckbox(checkBox, accentColor);
checkBox = editShareView.findViewById(R.id.canEditChangeCheckBox);
checkBox.setChecked((sharePermissions & OCShare.UPDATE_PERMISSION_FLAG) > 0);
checkBox.setVisibility(canEdit ? View.VISIBLE : View.GONE);
ThemeUtils.tintCheckbox(checkBox, accentColor);
checkBox = editShareView.findViewById(R.id.canEditDeleteCheckBox);
checkBox.setChecked((sharePermissions & OCShare.DELETE_PERMISSION_FLAG) > 0);
checkBox.setVisibility(canEdit ? View.VISIBLE : View.GONE);
ThemeUtils.tintCheckbox(checkBox, accentColor);
}
setPermissionsListening(editShareView, true);
}
}
/**
* Binds or unbinds listener for user actions to enable or disable a permission on the edited share
* to the views receiving the user events.
*
* @param editShareView Root view in the fragment.
* @param enable When 'true', listener is bound to view; when 'false', it is unbound.
*/
private void setPermissionsListening(View editShareView, boolean enable) {
if (enable && mOnPrivilegeChangeListener == null) {
mOnPrivilegeChangeListener = new OnPrivilegeChangeListener();
}
CompoundButton.OnCheckedChangeListener changeListener = enable ? mOnPrivilegeChangeListener : null;
CompoundButton compound;
compound = editShareView.findViewById(R.id.canShareSwitch);
compound.setOnCheckedChangeListener(changeListener);
compound = editShareView.findViewById(R.id.canEditSwitch);
compound.setOnCheckedChangeListener(changeListener);
if (mFile.isFolder()) {
compound = editShareView.findViewById(R.id.canEditCreateCheckBox);
compound.setOnCheckedChangeListener(changeListener);
compound = editShareView.findViewById(R.id.canEditChangeCheckBox);
compound.setOnCheckedChangeListener(changeListener);
compound = editShareView.findViewById(R.id.canEditDeleteCheckBox);
compound.setOnCheckedChangeListener(changeListener);
}
}
/**
* Listener for user actions that enable or disable a privilege
*/
private class OnPrivilegeChangeListener
implements CompoundButton.OnCheckedChangeListener {
/**
* Called by every {@link SwitchCompat} and {@link CheckBox} in the fragment to update
* the state of its associated permission.
*
* @param compound {@link CompoundButton} toggled by the user
* @param isChecked New switch state.
*/
@Override
public void onCheckedChanged(CompoundButton compound, boolean isChecked) {
if (!isResumed()) {
// very important, setCheched(...) is called automatically during
// Fragment recreation on device rotations
return;
}
/// else, getView() cannot be NULL
CompoundButton subordinate;
switch (compound.getId()) {
case R.id.canShareSwitch:
Log_OC.v(TAG, "canShareCheckBox toggled to " + isChecked);
updatePermissionsToShare();
break;
case R.id.canEditSwitch:
Log_OC.v(TAG, "canEditCheckBox toggled to " + isChecked);
/// sync subordinate CheckBoxes
boolean isFederated = ShareType.FEDERATED.equals(mShare.getShareType());
if (mFile.isFolder()) {
if (isChecked) {
if (!isFederated) {
/// not federated shares -> enable all the subpermisions
for (int subordinateCheckBoxId : sSubordinateCheckBoxIds) {
//noinspection ConstantConditions, prevented in the method beginning
subordinate = getView().findViewById(subordinateCheckBoxId);
subordinate.setVisibility(View.VISIBLE);
if (!subordinate.isChecked() && !mFile.isSharedWithMe()) { // see (1)
toggleDisablingListener(subordinate);
}
}
} else {
/// federated share -> enable delete subpermission, as server side; TODO why?
//noinspection ConstantConditions, prevented in the method beginning
subordinate = getView().findViewById(R.id.canEditDeleteCheckBox);
if (!subordinate.isChecked()) {
toggleDisablingListener(subordinate);
}
}
} else {
for (int sSubordinateCheckBoxId : sSubordinateCheckBoxIds) {
//noinspection ConstantConditions, prevented in the method beginning
subordinate = getView().findViewById(sSubordinateCheckBoxId);
subordinate.setVisibility(View.GONE);
if (subordinate.isChecked()) {
toggleDisablingListener(subordinate);
}
}
}
}
if (!(mFile.isFolder() && isChecked && mFile.isSharedWithMe()) // see (1)
|| isFederated) {
updatePermissionsToShare();
}
// updatePermissionsToShare() // see (1)
// (1) These modifications result in an exceptional UI behaviour for the case
// where the switch 'can edit' is enabled for a *reshared folder*; if the same
// behaviour was applied than for owned folder, and the user did not have full
// permissions to update the folder, an error would be reported by the server
// and the children checkboxes would be automatically hidden again
break;
case R.id.canEditCreateCheckBox:
Log_OC.v(TAG, "canEditCreateCheckBox toggled to " + isChecked);
syncCanEditSwitch(compound, isChecked);
updatePermissionsToShare();
break;
case R.id.canEditChangeCheckBox:
Log_OC.v(TAG, "canEditChangeCheckBox toggled to " + isChecked);
syncCanEditSwitch(compound, isChecked);
updatePermissionsToShare();
break;
case R.id.canEditDeleteCheckBox:
Log_OC.v(TAG, "canEditDeleteCheckBox toggled to " + isChecked);
syncCanEditSwitch(compound, isChecked);
updatePermissionsToShare();
break;
}
}
/**
* Sync value of "can edit" {@link SwitchCompat} according to a change in one of its subordinate checkboxes.
*
* If all the subordinates are disabled, "can edit" has to be disabled.
*
* If any subordinate is enabled, "can edit" has to be enabled.
*
* @param subordinateCheckBoxView Subordinate {@link CheckBox} that was changed.
* @param isChecked 'true' iif subordinateCheckBoxView was checked.
*/
private void syncCanEditSwitch(View subordinateCheckBoxView, boolean isChecked) {
CompoundButton canEditCompound = getView().findViewById(R.id.canEditSwitch);
if (isChecked) {
if (!canEditCompound.isChecked()) {
toggleDisablingListener(canEditCompound);
}
} else {
boolean allDisabled = true;
for (int i = 0; allDisabled && i < sSubordinateCheckBoxIds.length; i++) {
allDisabled &=
sSubordinateCheckBoxIds[i] == subordinateCheckBoxView.getId() ||
!((CheckBox) getView().findViewById(sSubordinateCheckBoxIds[i])).isChecked()
;
}
if (canEditCompound.isChecked() && allDisabled) {
toggleDisablingListener(canEditCompound);
for (int sSubordinateCheckBoxId : sSubordinateCheckBoxIds) {
getView().findViewById(sSubordinateCheckBoxId).setVisibility(View.GONE);
}
}
}
}
/**
* Toggle value of received {@link CompoundButton} granting that its change listener is not called.
*
* @param compound {@link CompoundButton} (switch or checkBox) to toggle without reporting to
* the change listener
*/
private void toggleDisablingListener(CompoundButton compound) {
compound.setOnCheckedChangeListener(null);
compound.toggle();
compound.setOnCheckedChangeListener(this);
}
}
/**
* Updates the UI after the result of an update operation on the edited {@link OCShare} permissions.
*
* @param result Result of an update on the edited {@link OCShare} permissions.
*/
public void onUpdateSharePermissionsFinished(RemoteOperationResult result) {
if (result.isSuccess()) {
refreshUiFromDB(getView());
} else {
refreshUiFromState(getView());
}
}
/**
* Get {@link OCShare} instance from DB and updates the UI.
*
* Depends on the parent Activity provides a {@link com.owncloud.android.datamodel.FileDataStorageManager}
* instance ready to use. If not ready, does nothing.
*/
public void refreshUiFromDB() {
if (getView() != null) {
refreshUiFromDB(getView());
}
}
/**
* Get {@link OCShare} instance from DB and updates the UI.
*
* Depends on the parent Activity provides a {@link com.owncloud.android.datamodel.FileDataStorageManager}
* instance ready to use. If not ready, does nothing.
*
* @param editShareView Root view in the fragment.
*/
private void refreshUiFromDB(View editShareView) {
FileDataStorageManager storageManager = ((FileActivity) getActivity()).getStorageManager();
if (storageManager != null) {
// Get edited share
mShare = storageManager.getShareById(mShare.getId());
// Updates UI with new state
refreshUiFromState(editShareView);
}
}
/**
* Updates the permissions of the {@link OCShare} according to the values set in the UI
*/
private void updatePermissionsToShare() {
SharePermissionsBuilder spb = new SharePermissionsBuilder();
spb.setSharePermission(getCanShareSwitch().isChecked());
if (mFile.isFolder()) {
spb.setUpdatePermission(getCanEditChangeCheckBox().isChecked())
.setCreatePermission(getCanEditCreateCheckBox().isChecked())
.setDeletePermission(getCanEditDeleteCheckBox().isChecked());
} else {
spb.setUpdatePermission(getCanEditSwitch().isChecked());
}
int permissions = spb.build();
((FileActivity) getActivity()).getFileOperationsHelper().
setPermissionsToShare(
mShare,
permissions
)
;
}
/**
* Shortcut to access {@link SwitchCompat} R.id.canShareSwitch
*
* @return {@link SwitchCompat} R.id.canShareCheckBox or null if called before
* {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} finished.
*/
private SwitchCompat getCanShareSwitch() {
return (SwitchCompat) getView().findViewById(R.id.canShareSwitch);
}
/**
* Shortcut to access {@link SwitchCompat} R.id.canEditSwitch
*
* @return {@link SwitchCompat} R.id.canEditSwitch or null if called before
* {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} finished.
*/
private SwitchCompat getCanEditSwitch() {
return (SwitchCompat) getView().findViewById(R.id.canEditSwitch);
}
/**
* Shortcut to access {@link CheckBox} R.id.canEditCreateCheckBox
*
* @return {@link CheckBox} R.id.canEditCreateCheckBox or null if called before
* {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} finished.
*/
private CheckBox getCanEditCreateCheckBox() {
return (CheckBox) getView().findViewById(R.id.canEditCreateCheckBox);
}
/**
* Shortcut to access {@link CheckBox} R.id.canEditChangeCheckBox
*
* @return {@link CheckBox} R.id.canEditChangeCheckBox or null if called before
* {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} finished.
*/
private CheckBox getCanEditChangeCheckBox() {
return (CheckBox) getView().findViewById(R.id.canEditChangeCheckBox);
}
/**
* Shortcut to access {@link CheckBox} R.id.canEditDeleteCheckBox
*
* @return {@link CheckBox} R.id.canEditDeleteCheckBox or null if called before
* {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} finished.
*/
private CheckBox getCanEditDeleteCheckBox() {
return (CheckBox) getView().findViewById(R.id.canEditDeleteCheckBox);
}
}

View file

@ -1,103 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
ownCloud Android client application
@author David A. Velasco
Copyright (C) 2015 ownCloud Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2,
as published by the Free Software Foundation.
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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.owncloud.android.ui.fragment.EditShareFragment"
android:id="@+id/shareScroll">
<LinearLayout android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/editShareTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/share_with_edit_title"
android:textAppearance="@style/TextAppearance.AppCompat.Title"
android:padding="@dimen/standard_padding"
android:singleLine="true"
android:ellipsize="middle"
/>
<View
android:id="@+id/share_header_divider"
android:layout_width="match_parent"
android:layout_height="@dimen/edit_share_layout_view_height"
android:background="@color/primary"
/>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/standard_margin"
android:layout_marginRight="@dimen/standard_margin"
android:layout_marginBottom="@dimen/standard_margin">
<androidx.appcompat.widget.SwitchCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/share_privilege_can_edit"
android:id="@+id/canEditSwitch"
android:layout_gravity="start"
android:layout_marginTop="@dimen/standard_half_margin"
android:textColor="@color/color_accent"
style="@style/TextAppearance.AppCompat.Body2"
/>
<androidx.appcompat.widget.AppCompatCheckBox
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/canEditCreateCheckBox"
android:text="@string/share_privilege_can_edit_create"
android:visibility="gone"
/>
<androidx.appcompat.widget.AppCompatCheckBox
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/canEditChangeCheckBox"
android:text="@string/share_privilege_can_edit_change"
android:visibility="gone"
/>
<androidx.appcompat.widget.AppCompatCheckBox
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/canEditDeleteCheckBox"
android:text="@string/share_privilege_can_edit_delete"
android:visibility="gone"
/>
<androidx.appcompat.widget.SwitchCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/share_privilege_can_share"
android:id="@+id/canShareSwitch"
android:layout_gravity="start"
android:layout_marginTop="@dimen/standard_half_margin"
android:textColor="@color/color_accent"
style="@style/TextAppearance.AppCompat.Body2"
/>
</LinearLayout>
</LinearLayout>
</ScrollView>

View file

@ -61,7 +61,6 @@
<dimen name="activity_row_layout_min_width_independent">196dip</dimen>
<dimen name="user_icon_size_independent">40dip</dimen>
<dimen name="drawer_header_subtext">12sp</dimen>
<dimen name="edit_share_layout_view_height">2dp</dimen>
<dimen name="fragment_margin">12dp</dimen>
<dimen name="file_download_fragment_layout_padding">20dp</dimen>
<dimen name="alternate_fragment_margin">15dp</dimen>

View file

@ -473,7 +473,6 @@
<string name="edit_permission_label">edit</string>
<string name="share_via_link_hide_file_listing_permission_label">Hide file listing</string>
<string name="share_with_title">Share with…</string>
<string name="share_with_edit_title">Share with %1$s</string>
<string name="share_via_link_unset_password">Unset</string>
<string name="share_search">Name, federated cloud ID or email address…</string>
@ -486,7 +485,6 @@
<string name="share_privilege_unshare">Unshare</string>
<string name="share_privilege_can_share">can share</string>
<string name="share_privilege_can_edit">can edit</string>
<string name="share_privilege_can_edit_create">can create</string>
<string name="share_privilege_can_edit_change">can change</string>
<string name="share_privilege_can_edit_delete">can delete</string>