Skip to content

Commit b4f36f4

Browse files
Merge pull request #3989 from nextcloud/askForPassword
Public share: if ask for password is set, show an optional password dialog
2 parents 3b24d09 + 1edf2cd commit b4f36f4

File tree

12 files changed

+112
-50
lines changed

12 files changed

+112
-50
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
438
1+
438

src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1924,6 +1924,8 @@ public OCCapability saveCapabilities(OCCapability capability) {
19241924
capability.getFilesSharingPublicEnabled().getValue());
19251925
cv.put(ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_PASSWORD_ENFORCED,
19261926
capability.getFilesSharingPublicPasswordEnforced().getValue());
1927+
cv.put(ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_ASK_FOR_OPTIONAL_PASSWORD,
1928+
capability.getFilesSharingPublicAskForOptionalPassword().getValue());
19271929
cv.put(ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_EXPIRE_DATE_ENABLED,
19281930
capability.getFilesSharingPublicExpireDateEnabled().getValue());
19291931
cv.put(ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_EXPIRE_DATE_DAYS,
@@ -2078,6 +2080,9 @@ private OCCapability createCapabilityInstance(Cursor c) {
20782080
.getColumnIndex(ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_ENABLED))));
20792081
capability.setFilesSharingPublicPasswordEnforced(CapabilityBooleanType.fromValue(c.getInt(c
20802082
.getColumnIndex(ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_PASSWORD_ENFORCED))));
2083+
capability.setFilesSharingPublicAskForOptionalPassword(
2084+
CapabilityBooleanType.fromValue(
2085+
c.getInt(c.getColumnIndex(ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_ASK_FOR_OPTIONAL_PASSWORD))));
20812086
capability.setFilesSharingPublicExpireDateEnabled(CapabilityBooleanType.fromValue(c.getInt(c
20822087
.getColumnIndex(ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_EXPIRE_DATE_ENABLED))));
20832088
capability.setFilesSharingPublicExpireDateDays(c.getInt(c

src/main/java/com/owncloud/android/db/ProviderMeta.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
*/
3232
public class ProviderMeta {
3333
public static final String DB_NAME = "filelist";
34-
public static final int DB_VERSION = 46;
34+
public static final int DB_VERSION = 47;
3535

3636
private ProviderMeta() {
3737
// No instance
@@ -155,6 +155,8 @@ static public class ProviderTableMeta implements BaseColumns {
155155
public static final String CAPABILITIES_SHARING_API_ENABLED = "sharing_api_enabled";
156156
public static final String CAPABILITIES_SHARING_PUBLIC_ENABLED = "sharing_public_enabled";
157157
public static final String CAPABILITIES_SHARING_PUBLIC_PASSWORD_ENFORCED = "sharing_public_password_enforced";
158+
public static final String CAPABILITIES_SHARING_PUBLIC_ASK_FOR_OPTIONAL_PASSWORD =
159+
"sharing_public_ask_for_optional_password";
158160
public static final String CAPABILITIES_SHARING_PUBLIC_EXPIRE_DATE_ENABLED =
159161
"sharing_public_expire_date_enabled";
160162
public static final String CAPABILITIES_SHARING_PUBLIC_EXPIRE_DATE_DAYS =

src/main/java/com/owncloud/android/providers/FileContentProvider.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -770,7 +770,8 @@ private void createCapabilitiesTable(SQLiteDatabase db) {
770770
+ ProviderTableMeta.CAPABILITIES_RICHDOCUMENT_MIMETYPE_LIST + TEXT
771771
+ ProviderTableMeta.CAPABILITIES_RICHDOCUMENT_DIRECT_EDITING + INTEGER
772772
+ ProviderTableMeta.CAPABILITIES_RICHDOCUMENT_TEMPLATES + INTEGER
773-
+ ProviderTableMeta.CAPABILITIES_RICHDOCUMENT_OPTIONAL_MIMETYPE_LIST + " TEXT );");
773+
+ ProviderTableMeta.CAPABILITIES_RICHDOCUMENT_OPTIONAL_MIMETYPE_LIST + TEXT
774+
+ ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_ASK_FOR_OPTIONAL_PASSWORD + " INTEGER );");
774775
}
775776

776777
private void createUploadsTable(SQLiteDatabase db) {
@@ -1946,6 +1947,25 @@ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
19461947
if (!upgraded) {
19471948
Log_OC.i(SQL, String.format(Locale.ENGLISH, UPGRADE_VERSION_MSG, oldVersion, newVersion));
19481949
}
1950+
1951+
if (oldVersion < 47 && newVersion >= 47) {
1952+
Log_OC.i(SQL, "Entering in the #47 add askForPassword to capability table");
1953+
db.beginTransaction();
1954+
try {
1955+
db.execSQL(ALTER_TABLE + ProviderTableMeta.CAPABILITIES_TABLE_NAME +
1956+
ADD_COLUMN + ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_ASK_FOR_OPTIONAL_PASSWORD +
1957+
" INTEGER ");
1958+
1959+
upgraded = true;
1960+
db.setTransactionSuccessful();
1961+
} finally {
1962+
db.endTransaction();
1963+
}
1964+
}
1965+
1966+
if (!upgraded) {
1967+
Log_OC.i(SQL, String.format(Locale.ENGLISH, UPGRADE_VERSION_MSG, oldVersion, newVersion));
1968+
}
19491969
}
19501970

19511971
@Override

src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2016,10 +2016,13 @@ private void onCreateShareViaLinkOperationFinish(CreateShareViaLinkOperation ope
20162016
// Was tried without password, but not sure that it's optional.
20172017

20182018
// Try with password before giving up; see also ShareFileFragment#OnShareViaLinkListener
2019-
if (fileDetailFragment != null
2020-
&& fileDetailFragment.isAdded()) { // only if added to the view hierarchy!!
2019+
if (fileDetailFragment != null && fileDetailFragment.isAdded()) { // only if added to the view hierarchy
20212020

2022-
fileDetailFragment.getFileDetailSharingFragment().requestPasswordForShareViaLink(true);
2021+
fileDetailFragment
2022+
.getFileDetailSharingFragment()
2023+
.requestPasswordForShareViaLink(true,
2024+
getCapabilities().getFilesSharingPublicAskForOptionalPassword()
2025+
.isTrue());
20232026
}
20242027

20252028
} else {

src/main/java/com/owncloud/android/ui/activity/ShareActivity.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -355,10 +355,11 @@ private void onCreateShareViaLinkOperationFinish(CreateShareViaLinkOperation ope
355355

356356
// Try with password before giving up; see also ShareFileFragment#OnShareViaLinkListener
357357
ShareFileFragment shareFileFragment = getShareFileFragment();
358-
if (shareFileFragment != null
359-
&& shareFileFragment.isAdded()) { // only if added to the view hierarchy!!
358+
if (shareFileFragment != null && shareFileFragment.isAdded()) { // only if added to the view hierarchy!!
360359

361-
shareFileFragment.requestPasswordForShareViaLink(true);
360+
boolean askForPassword = getCapabilities().getFilesSharingPublicAskForOptionalPassword().isTrue();
361+
362+
shareFileFragment.requestPasswordForShareViaLink(true, askForPassword);
362363
}
363364

364365
} else {

src/main/java/com/owncloud/android/ui/dialog/SendShareDialog.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.owncloud.android.R;
1919
import com.owncloud.android.datamodel.OCFile;
2020
import com.owncloud.android.lib.common.utils.Log_OC;
21+
import com.owncloud.android.lib.resources.status.OCCapability;
2122
import com.owncloud.android.ui.activity.FileActivity;
2223
import com.owncloud.android.ui.activity.FileDisplayActivity;
2324
import com.owncloud.android.ui.adapter.SendButtonAdapter;
@@ -26,6 +27,8 @@
2627
import com.owncloud.android.utils.MimeTypeUtil;
2728
import com.owncloud.android.utils.ThemeUtils;
2829

30+
import org.jetbrains.annotations.NotNull;
31+
2932
import java.util.ArrayList;
3033
import java.util.List;
3134

@@ -60,6 +63,7 @@ public class SendShareDialog extends BottomSheetDialogFragment {
6063

6164
private static final String KEY_OCFILE = "KEY_OCFILE";
6265
private static final String KEY_SHARING_PUBLIC_PASSWORD_ENFORCED = "KEY_SHARING_PUBLIC_PASSWORD_ENFORCED";
66+
private static final String KEY_SHARING_PUBLIC_ASK_FOR_PASSWORD = "KEY_SHARING_PUBLIC_ASK_FOR_PASSWORD";
6367
private static final String KEY_HIDE_NCSHARING_OPTIONS = "KEY_HIDE_NCSHARING_OPTIONS";
6468
private static final String TAG = SendShareDialog.class.getSimpleName();
6569
public static final String PACKAGE_NAME = "PACKAGE_NAME";
@@ -69,16 +73,20 @@ public class SendShareDialog extends BottomSheetDialogFragment {
6973
private OCFile file;
7074
private boolean hideNcSharingOptions;
7175
private boolean sharingPublicPasswordEnforced;
76+
private boolean sharingPublicAskForPassword;
7277
private FileOperationsHelper fileOperationsHelper;
7378

74-
public static SendShareDialog newInstance(OCFile file, boolean hideNcSharingOptions, boolean sharingPublicPasswordEnforced) {
79+
public static SendShareDialog newInstance(OCFile file, boolean hideNcSharingOptions, OCCapability capability) {
7580

7681
SendShareDialog dialogFragment = new SendShareDialog();
7782

7883
Bundle args = new Bundle();
7984
args.putParcelable(KEY_OCFILE, file);
8085
args.putBoolean(KEY_HIDE_NCSHARING_OPTIONS, hideNcSharingOptions);
81-
args.putBoolean(KEY_SHARING_PUBLIC_PASSWORD_ENFORCED, sharingPublicPasswordEnforced);
86+
args.putBoolean(KEY_SHARING_PUBLIC_PASSWORD_ENFORCED,
87+
capability.getFilesSharingPublicPasswordEnforced().isTrue());
88+
args.putBoolean(KEY_SHARING_PUBLIC_ASK_FOR_PASSWORD,
89+
capability.getFilesSharingPublicAskForOptionalPassword().isTrue());
8290
dialogFragment.setArguments(args);
8391

8492
return dialogFragment;
@@ -93,11 +101,14 @@ public void onCreate(@Nullable Bundle savedInstanceState) {
93101
file = getArguments().getParcelable(KEY_OCFILE);
94102
hideNcSharingOptions = getArguments().getBoolean(KEY_HIDE_NCSHARING_OPTIONS, false);
95103
sharingPublicPasswordEnforced = getArguments().getBoolean(KEY_SHARING_PUBLIC_PASSWORD_ENFORCED, false);
104+
sharingPublicAskForPassword = getArguments().getBoolean(KEY_SHARING_PUBLIC_ASK_FOR_PASSWORD);
96105
}
97106

98107
@Nullable
99108
@Override
100-
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
109+
public View onCreateView(@NotNull LayoutInflater inflater,
110+
@Nullable ViewGroup container,
111+
@Nullable Bundle savedInstanceState) {
101112

102113
view = inflater.inflate(R.layout.send_share_fragment, container, false);
103114

@@ -178,7 +189,9 @@ private void shareByLink() {
178189
}
179190

180191
private void requestPasswordForShareViaLink() {
181-
SharePasswordDialogFragment dialog = SharePasswordDialogFragment.newInstance(file, true);
192+
SharePasswordDialogFragment dialog = SharePasswordDialogFragment.newInstance(file,
193+
true,
194+
sharingPublicAskForPassword);
182195
dialog.show(getFragmentManager(), SharePasswordDialogFragment.PASSWORD_FRAGMENT);
183196
}
184197

src/main/java/com/owncloud/android/ui/dialog/SharePasswordDialogFragment.java

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,13 @@ public class SharePasswordDialogFragment extends DialogFragment implements Dialo
5555
private static final String ARG_FILE = "FILE";
5656
private static final String ARG_SHARE = "SHARE";
5757
private static final String ARG_CREATE_SHARE = "CREATE_SHARE";
58+
private static final String ARG_ASK_FOR_PASSWORD = "ASK_FOR_PASSWORD";
5859
public static final String PASSWORD_FRAGMENT = "PASSWORD_FRAGMENT";
5960

6061
private OCFile file;
6162
private OCShare share;
6263
private boolean createShare;
64+
private boolean askForPassword;
6365

6466
@Override
6567
public void onStart() {
@@ -81,11 +83,12 @@ public void onStart() {
8183
* is bound to it.
8284
* @return Dialog ready to show.
8385
*/
84-
public static SharePasswordDialogFragment newInstance(OCFile file, boolean createShare) {
86+
public static SharePasswordDialogFragment newInstance(OCFile file, boolean createShare, boolean askForPassword) {
8587
SharePasswordDialogFragment frag = new SharePasswordDialogFragment();
8688
Bundle args = new Bundle();
8789
args.putParcelable(ARG_FILE, file);
8890
args.putBoolean(ARG_CREATE_SHARE, createShare);
91+
args.putBoolean(ARG_ASK_FOR_PASSWORD, askForPassword);
8992
frag.setArguments(args);
9093
return frag;
9194
}
@@ -116,6 +119,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) {
116119
file = getArguments().getParcelable(ARG_FILE);
117120
share = getArguments().getParcelable(ARG_SHARE);
118121
createShare = getArguments().getBoolean(ARG_CREATE_SHARE, false);
122+
askForPassword = getArguments().getBoolean(ARG_ASK_FOR_PASSWORD, false);
119123

120124
// Inflate the layout for the dialog
121125
LayoutInflater inflater = getActivity().getLayoutInflater();
@@ -130,14 +134,21 @@ public Dialog onCreateDialog(Bundle savedInstanceState) {
130134
inputText.setText("");
131135
inputText.requestFocus();
132136

137+
int title;
138+
if (askForPassword) {
139+
title = R.string.share_link_optional_password_title;
140+
} else {
141+
title = R.string.share_link_password_title;
142+
}
143+
133144
// Build the dialog
134145
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(),
135146
R.style.Theme_ownCloud_Dialog_NoButtonBarStyle);
136147
builder.setView(v)
137148
.setPositiveButton(R.string.common_ok, this)
138149
.setNegativeButton(R.string.common_cancel, this)
139150
.setNeutralButton(R.string.common_delete, this)
140-
.setTitle(R.string.share_link_password_title);
151+
.setTitle(title);
141152
Dialog d = builder.create();
142153

143154
Window window = d.getWindow();
@@ -153,11 +164,9 @@ public void onClick(DialogInterface dialog, int which) {
153164
if (which == AlertDialog.BUTTON_POSITIVE) {
154165
String password = ((TextView) (getDialog().findViewById(R.id.share_password))).getText().toString();
155166

156-
if (TextUtils.isEmpty(password)) {
157-
DisplayUtils.showSnackMessage(
158-
getActivity().findViewById(android.R.id.content),
159-
R.string.share_link_empty_password
160-
);
167+
if (!askForPassword && TextUtils.isEmpty(password)) {
168+
DisplayUtils.showSnackMessage(getActivity().findViewById(android.R.id.content),
169+
R.string.share_link_empty_password);
161170
return;
162171
}
163172

@@ -172,6 +181,12 @@ public void onClick(DialogInterface dialog, int which) {
172181
} else {
173182
setPassword(share, null);
174183
}
184+
} else if (which == AlertDialog.BUTTON_NEGATIVE && askForPassword) {
185+
if (share == null) {
186+
setPassword(createShare, file, null);
187+
} else {
188+
setPassword(share, null);
189+
}
175190
}
176191
}
177192

src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -320,10 +320,11 @@ public void toggleShareByLink() {
320320
}
321321

322322
private void createShareLink() {
323-
if (capabilities != null &&
324-
capabilities.getFilesSharingPublicPasswordEnforced().isTrue()) {
323+
if (capabilities != null && (capabilities.getFilesSharingPublicPasswordEnforced().isTrue() ||
324+
capabilities.getFilesSharingPublicAskForOptionalPassword().isTrue())) {
325325
// password enforced by server, request to the user before trying to create
326-
requestPasswordForShareViaLink(true);
326+
requestPasswordForShareViaLink(true,
327+
capabilities.getFilesSharingPublicAskForOptionalPassword().isTrue());
327328

328329
} else {
329330
// create without password if not enforced by server or we don't know if enforced;
@@ -417,7 +418,8 @@ private boolean optionsItemSelected(MenuItem item) {
417418

418419
return true;
419420
case R.id.action_password: {
420-
requestPasswordForShareViaLink(false);
421+
requestPasswordForShareViaLink(false,
422+
capabilities.getFilesSharingPublicAskForOptionalPassword().isTrue());
421423
return true;
422424
}
423425
case R.id.action_share_expiration_date: {
@@ -527,12 +529,14 @@ public void updateNoteToShare(OCShare share, String note) {
527529
/**
528530
* Starts a dialog that requests a password to the user to protect a share link.
529531
*
530-
* @param createShare When 'true', the request for password will be followed by the creation of a new
531-
* public link; when 'false', a public share is assumed to exist, and the password
532-
* is bound to it.
532+
* @param createShare When 'true', the request for password will be followed by the creation of a new public
533+
* link; when 'false', a public share is assumed to exist, and the password is bound to it.
534+
* @param askForPassword if true, password is optional
533535
*/
534-
public void requestPasswordForShareViaLink(boolean createShare) {
535-
SharePasswordDialogFragment dialog = SharePasswordDialogFragment.newInstance(file, createShare);
536+
public void requestPasswordForShareViaLink(boolean createShare, boolean askForPassword) {
537+
SharePasswordDialogFragment dialog = SharePasswordDialogFragment.newInstance(file,
538+
createShare,
539+
askForPassword);
536540
dialog.show(getChildFragmentManager(), SharePasswordDialogFragment.PASSWORD_FRAGMENT);
537541
}
538542

0 commit comments

Comments
 (0)