Compare commits
77 Commits
v1.09e-r3
...
bug-2378-p
Author | SHA1 | Date | |
---|---|---|---|
![]() |
e3ae3233fe | ||
![]() |
bc464b0eba | ||
![]() |
9b3d7250ec | ||
![]() |
b04f7f6c81 | ||
![]() |
41151a184b | ||
![]() |
9d9b24cb98 | ||
![]() |
087e3f5931 | ||
![]() |
100ed6e58e | ||
![]() |
a5bce53a12 | ||
![]() |
c9be806b01 | ||
![]() |
c16eeff130 | ||
![]() |
03ea073426 | ||
![]() |
cde5d31845 | ||
![]() |
85709e4058 | ||
![]() |
3f6e51b126 | ||
![]() |
c0345d1309 | ||
![]() |
746dcd4c6b | ||
![]() |
37a6da5a3b | ||
![]() |
1efe2e16a5 | ||
![]() |
5cbddb4fcc | ||
![]() |
b3a73f20d4 | ||
![]() |
badf99c20d | ||
![]() |
b8318f7fa5 | ||
![]() |
f0e30459a2 | ||
![]() |
e101ffb01e | ||
![]() |
a05ef51d44 | ||
![]() |
8aacdf683b | ||
![]() |
0502efde14 | ||
![]() |
94ede3a696 | ||
![]() |
9933fa1f9d | ||
![]() |
4910c73a5e | ||
![]() |
cf222a2db1 | ||
![]() |
a9ad3725dc | ||
![]() |
40d3fe1cd9 | ||
![]() |
1e90a52275 | ||
![]() |
8596edaa67 | ||
![]() |
38f1aa4d3d | ||
![]() |
984da3fd3b | ||
![]() |
ed7138991d | ||
![]() |
1e78527164 | ||
![]() |
a6540b4462 | ||
![]() |
230b3941e8 | ||
![]() |
554f88c723 | ||
![]() |
4cd32d30c6 | ||
![]() |
a76c43a800 | ||
![]() |
d0da83182f | ||
![]() |
ec5f26e0cd | ||
![]() |
6110166af8 | ||
![]() |
6f10a04589 | ||
![]() |
eedeeafd80 | ||
![]() |
e0c003fcb2 | ||
![]() |
ad3b1500bb | ||
![]() |
5f2a976fde | ||
![]() |
dd0becdfd8 | ||
![]() |
cacd204ac2 | ||
![]() |
728fd2f8ae | ||
![]() |
944f44bc4b | ||
![]() |
58047d5386 | ||
![]() |
c0a06c9f3a | ||
![]() |
d0c041a0e2 | ||
![]() |
df060e2f4b | ||
![]() |
aea55dad45 | ||
![]() |
5442dbf441 | ||
![]() |
317476d9b5 | ||
![]() |
ad0acb7a69 | ||
![]() |
b66ae5d264 | ||
![]() |
d87706fa43 | ||
![]() |
cb25d12709 | ||
![]() |
dce536009e | ||
![]() |
656e785214 | ||
![]() |
35d50a6eb0 | ||
![]() |
786bb646c2 | ||
![]() |
72cc6ff768 | ||
![]() |
404e07e5c0 | ||
![]() |
2378cd0d7c | ||
![]() |
b149bab761 | ||
![]() |
5ebd8e5e33 |
53
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
name: Bug Report
|
||||
description: Report a bug.
|
||||
title: "[BUG] "
|
||||
labels: bug
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Please check out the [FAQ section](https://github.com/PhilippC/keepass2android/blob/master/docs/Documentation.md#faq) and [search for open issues](https://github.com/PhilippC/keepass2android/issues?q=is%3Aopen+is%3Aissue+label%3Abug) first.
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Checks
|
||||
options:
|
||||
- label: I have read the FAQ section, searched the open issues, and still think this is a new bug.
|
||||
required: true
|
||||
- type: textarea
|
||||
id: bug
|
||||
attributes:
|
||||
label: "Describe the bug you encountered:"
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: expected
|
||||
attributes:
|
||||
label: "Describe what you expected to happen:"
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Please follow these steps to find your app version:
|
||||
1. Click the **⁝** icon in the top right corner
|
||||
2. Select **Settings**
|
||||
3. Click **About**
|
||||
4. Find the "Version" information and provide it below
|
||||
- type: input
|
||||
id: version
|
||||
attributes:
|
||||
label: "What version of Keepass2Android are you using?"
|
||||
validations:
|
||||
required: true
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Please follow these steps to find your Android version:
|
||||
1. Open your device's **Settings** app
|
||||
2. Scroll down and select **About phone** or **About tablet**
|
||||
3. Find the **Android version** section and provide it below
|
||||
- type: input
|
||||
id: os
|
||||
attributes:
|
||||
label: "Which version of Android are you on?"
|
||||
validations:
|
||||
required: true
|
||||
|
8
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
---
|
||||
name: Feature Request
|
||||
about: Suggest an idea for this project.
|
||||
title: '[FEAT] '
|
||||
labels: enhancement
|
||||
assignees: ''
|
||||
|
||||
---
|
16
.github/ISSUE_TEMPLATE/question.md
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
---
|
||||
name: Question
|
||||
about: Ask a question about 'Keepass2Android'.
|
||||
title: '[QUESTION] '
|
||||
labels: question
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**What version of Keepass2Android are you using?**
|
||||
Please follow these steps to find your app version:
|
||||
1. Click the **⁝** icon in the top right corner
|
||||
2. Select **Settings**
|
||||
3. Click **About**
|
||||
4. Find the "Version" information and provide it here:
|
||||
|
12
Makefile
@@ -314,6 +314,18 @@ clean_KP2AKdbLibrary:
|
||||
cd src/java/KP2AKdbLibrary && $(GRADLEW) clean
|
||||
clean_PluginQR:
|
||||
cd src/java/PluginQR && $(GRADLEW) clean
|
||||
clean_rm:
|
||||
rm -rf src/*/obj
|
||||
rm -rf src/*/bin
|
||||
rm -rf src/java/*/app/build
|
||||
rm -rf src/java/argon2/obj
|
||||
rm -rf src/java/argon2/libs
|
||||
rm -rf src/packages
|
||||
rm -rf src/java/KP2AKdbLibrary/app/.cxx
|
||||
rm -rf src/java/KP2ASoftkeyboard_AS/app/.cxx
|
||||
rm -rf src/SamsungPass/Xamarin.SamsungPass/SamsungPass/bin
|
||||
rm -rf src/SamsungPass/Xamarin.SamsungPass/SamsungPass/obj
|
||||
|
||||
|
||||
# https://learn.microsoft.com/en-us/nuget/consume-packages/package-restore-troubleshooting#other-potential-conditions
|
||||
clean_nuget:
|
||||
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 9.4 KiB |
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 67 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 52 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 54 KiB |
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 107 KiB After Width: | Height: | Size: 87 KiB |
@@ -18,6 +18,8 @@ Keepass2Android does not collect personal identifiable information. For debuggin
|
||||
* **Internet** (Keepass2Android regular only): Required to allow the user to read/store password databases or key files on remote locations, e.g. Dropbox or via WebDav.
|
||||
* **Contacts/Accounts** (Keepass2Android regular only): Required by the Google Drive SDK. If you want to access files on Google Drive, you are prompted to select one of the Google Accounts on your phone to use. The permission is required to query the list of Google accounts on the device. Keepass2Android does not access your personal contacts.
|
||||
* **Storage**: Required to allow the user to read/store password databases or key files on the device locally.
|
||||
* **Fingerprint**: Required if you want to use fingerprint unlock.
|
||||
* **Fingerprint/Biometric**: Required if you want to use biometric unlock.
|
||||
* **Vibrate**: Required by the built-in keyboard (vibrate on key press)
|
||||
* **Camera**: Required for scanning OTP QR Codes
|
||||
* **Foreground service**: Required to keep the app alive for QuickUnlock (so you don't need to enter your full master password repeatedly)
|
||||
|
||||
|
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 69 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 2.9 KiB |
@@ -134,10 +134,10 @@ namespace Kp2aAutofillParser
|
||||
/// </summary>
|
||||
public class FilledAutofillFieldCollection<FieldT> where FieldT:InputField
|
||||
{
|
||||
public Dictionary<string, FilledAutofillField<FieldT>> HintMap { get; }
|
||||
public Dictionary<string, FilledAutofillField> HintMap { get; }
|
||||
public string DatasetName { get; set; }
|
||||
|
||||
public FilledAutofillFieldCollection(Dictionary<string, FilledAutofillField<FieldT>> hintMap, string datasetName = "")
|
||||
public FilledAutofillFieldCollection(Dictionary<string, FilledAutofillField> hintMap, string datasetName = "")
|
||||
{
|
||||
//recreate hint map making sure we compare case insensitive
|
||||
HintMap = BuildHintMap();
|
||||
@@ -149,9 +149,9 @@ namespace Kp2aAutofillParser
|
||||
public FilledAutofillFieldCollection() : this(BuildHintMap())
|
||||
{ }
|
||||
|
||||
private static Dictionary<string, FilledAutofillField<FieldT>> BuildHintMap()
|
||||
private static Dictionary<string, FilledAutofillField> BuildHintMap()
|
||||
{
|
||||
return new Dictionary<string, FilledAutofillField<FieldT>>(StringComparer.OrdinalIgnoreCase);
|
||||
return new Dictionary<string, FilledAutofillField>(StringComparer.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -159,7 +159,7 @@ namespace Kp2aAutofillParser
|
||||
/// </summary>
|
||||
/// <returns>The add.</returns>
|
||||
/// <param name="filledAutofillField">Filled autofill field.</param>
|
||||
public void Add(FilledAutofillField<FieldT> filledAutofillField)
|
||||
public void Add(FilledAutofillField filledAutofillField)
|
||||
{
|
||||
foreach (string hint in filledAutofillField.AutofillHints)
|
||||
{
|
||||
@@ -572,7 +572,7 @@ namespace Kp2aAutofillParser
|
||||
}
|
||||
}
|
||||
|
||||
public class FilledAutofillField<FieldT> where FieldT : InputField
|
||||
public class FilledAutofillField
|
||||
{
|
||||
private string[] _autofillHints;
|
||||
public string TextValue { get; set; }
|
||||
@@ -611,13 +611,13 @@ namespace Kp2aAutofillParser
|
||||
public FilledAutofillField()
|
||||
{ }
|
||||
|
||||
public FilledAutofillField(FieldT inputField)
|
||||
public FilledAutofillField(InputField inputField)
|
||||
: this(inputField, inputField.AutofillHints)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public FilledAutofillField(FieldT inputField, string[] hints)
|
||||
public FilledAutofillField(InputField inputField, string[] hints)
|
||||
{
|
||||
|
||||
string[] rawHints = AutofillHintsHelper.FilterForSupportedHints(hints);
|
||||
@@ -665,6 +665,7 @@ namespace Kp2aAutofillParser
|
||||
}
|
||||
}
|
||||
AutofillHints = AutofillHintsHelper.ConvertToCanonicalLowerCaseHints(hintList.ToArray()).ToArray();
|
||||
inputField.FillFilledAutofillValue(this);
|
||||
|
||||
|
||||
}
|
||||
@@ -679,7 +680,7 @@ namespace Kp2aAutofillParser
|
||||
if (this == obj) return true;
|
||||
if (obj == null || GetType() != obj.GetType()) return false;
|
||||
|
||||
FilledAutofillField<FieldT> that = (FilledAutofillField<FieldT>)obj;
|
||||
FilledAutofillField that = (FilledAutofillField)obj;
|
||||
|
||||
if (!TextValue?.Equals(that.TextValue) ?? that.TextValue != null)
|
||||
return false;
|
||||
@@ -717,6 +718,8 @@ namespace Kp2aAutofillParser
|
||||
public string HtmlInfoTag { get; set; }
|
||||
public string HtmlInfoTypeAttribute { get; set; }
|
||||
|
||||
public abstract void FillFilledAutofillValue(FilledAutofillField filledField);
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -838,7 +841,7 @@ namespace Kp2aAutofillParser
|
||||
continue;
|
||||
if (viewHints.Select(AutofillHintsHelper.ToCanonicalHint).Intersect(_autofillHintsForLogin).Any())
|
||||
{
|
||||
FieldsMappedToHints.Add(viewNode, viewHints.Select(AutofillHintsHelper.ToCanonicalHint).ToHashSet().ToArray());
|
||||
AddFieldToHintMap(viewNode, viewHints.Select(AutofillHintsHelper.ToCanonicalHint).ToHashSet().ToArray());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -873,9 +876,9 @@ namespace Kp2aAutofillParser
|
||||
if (passwordFields.Concat(usernameFields).Any(f => f.IsFocused))
|
||||
{
|
||||
foreach (var uf in usernameFields)
|
||||
FieldsMappedToHints.Add(uf, new string[] { AutofillHintsHelper.AutofillHintUsername });
|
||||
AddFieldToHintMap(uf, new string[] { AutofillHintsHelper.AutofillHintUsername });
|
||||
foreach (var pf in passwordFields.Except(usernameFields))
|
||||
FieldsMappedToHints.Add(pf, new string[] { AutofillHintsHelper.AutofillHintPassword });
|
||||
AddFieldToHintMap(pf, new string[] { AutofillHintsHelper.AutofillHintPassword });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -895,6 +898,18 @@ namespace Kp2aAutofillParser
|
||||
return result;
|
||||
}
|
||||
|
||||
private void AddFieldToHintMap(FieldT field, string[] hints)
|
||||
{
|
||||
if (FieldsMappedToHints.ContainsKey(field))
|
||||
{
|
||||
FieldsMappedToHints[field] = FieldsMappedToHints[field].Concat(hints).ToArray();
|
||||
}
|
||||
else
|
||||
{
|
||||
FieldsMappedToHints[field] = hints;
|
||||
}
|
||||
}
|
||||
|
||||
public bool LogAutofillView { get; set; }
|
||||
|
||||
private bool IsEditText(FieldT f)
|
||||
@@ -944,11 +959,6 @@ namespace Kp2aAutofillParser
|
||||
|
||||
private static bool IsPassword(InputField f)
|
||||
{
|
||||
if (f.IdEntry?.Contains("password") == true)
|
||||
{
|
||||
f = f;
|
||||
}
|
||||
|
||||
InputTypes inputType = f.InputType;
|
||||
|
||||
return
|
||||
@@ -963,7 +973,7 @@ namespace Kp2aAutofillParser
|
||||
|| IsInputTypeVariation(inputType, InputTypes.TextVariationWebPassword)
|
||||
)
|
||||
)
|
||||
|| (f.AutofillHints != null && f.AutofillHints.First() == "passwordAuto")
|
||||
|| (f.AutofillHints != null && f.AutofillHints.FirstOrDefault() == "passwordAuto")
|
||||
|| (f.HtmlInfoTypeAttribute == "password")
|
||||
);
|
||||
}
|
||||
|
@@ -18,6 +18,9 @@ namespace Kp2aAutofillParserTest
|
||||
class TestInputField: InputField
|
||||
{
|
||||
public string[] ExpectedAssignedHints { get; set; }
|
||||
public override void FillFilledAutofillValue(FilledAutofillField filledField)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -27,11 +30,18 @@ namespace Kp2aAutofillParserTest
|
||||
RunTestFromAutofillInput(resourceName, "com.servicenet.mobile");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TestCrashRegressionEmptySequence()
|
||||
{
|
||||
var resourceName = "Kp2aAutofillParserTest.imdb.json";
|
||||
RunTestFromAutofillInput(resourceName, "com.vivaldi.browser", "m.imdb.com");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TestFocusedPasswordAutoIsFilled()
|
||||
{
|
||||
var resourceName = "Kp2aAutofillParserTest.com-servicenet-mobile-focused.json";
|
||||
RunTestFromAutofillInput(resourceName, "com.servicenet.mobile" );
|
||||
RunTestFromAutofillInput(resourceName, "com.servicenet.mobile");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
@@ -15,6 +15,7 @@
|
||||
<None Remove="com-servicenet-mobile-focused.json" />
|
||||
<None Remove="com-servicenet-mobile-no-focus.json" />
|
||||
<None Remove="firefox-amazon-it.json" />
|
||||
<None Remove="imdb.json" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
@@ -53,6 +54,9 @@
|
||||
<EmbeddedResource Include="com-servicenet-mobile-no-focus.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="imdb.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
728
src/Kp2aAutofillParserTest/imdb.json
Normal file
@@ -0,0 +1,728 @@
|
||||
{
|
||||
"InputFields": [
|
||||
{
|
||||
"IdEntry": null,
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "action_bar_root",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "custom_tabs_handle_view_stub",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "coordinator",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.ViewGroup",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "compositor_view_holder",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": null,
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": true,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": "form",
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": null,
|
||||
"Hint": "",
|
||||
"ClassName": null,
|
||||
"AutofillHints": [],
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": "input",
|
||||
"HtmlInfoTypeAttribute": "checkbox"
|
||||
},
|
||||
{
|
||||
"IdEntry": null,
|
||||
"Hint": "Search IMDb",
|
||||
"ClassName": null,
|
||||
"AutofillHints": [
|
||||
"off"
|
||||
],
|
||||
"IsFocused": true,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": "input",
|
||||
"HtmlInfoTypeAttribute": "text"
|
||||
},
|
||||
{
|
||||
"IdEntry": "main_tab_switcher",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.RelativeLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "ar_view_holder",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "capture_overlay",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "overview_list_layout_holder",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "bottom_container",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "keyboard_accessory_sheet_stub",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "bottombar_stub",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "tab_modal_dialog_container_stub",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "tab_modal_dialog_container_sibling_view",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "omnibox_results_container_stub",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "panel_stub",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "search_engine_suggestion_stub",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "action_bar_black_background",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "bottom_controls",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "bottom_controls_wrapper",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.LinearLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "tab_group_ui_bottom_container",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "tab_group_ui_toolbar_view",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "bottom_container_slot",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "bottom_toolbar",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "bottom_toolbar_browsing",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.LinearLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "tab_switcher_tab_layout_toggle",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.RelativeLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "tab_switcher_tab_layout",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.HorizontalScrollView",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": null,
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.TextView",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": null,
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.TextView",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": null,
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.TextView",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": null,
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.TextView",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "control_container",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "find_toolbar_stub",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "find_toolbar_tablet_stub",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "toolbar_container",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "tab_group_ui_top_container",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "toolbar",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "location_bar",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "location_bar_status_view_left_space",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "location_bar_status",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.LinearLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "location_bar_incognito_badge_stub",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "location_bar_status_icon_view",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.LinearLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "location_bar_status_icon_frame",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "location_bar_status_icon_bg",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "location_bar_status_icon_holding_space",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "location_bar_verbose_status",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.TextView",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "location_bar_verbose_status_separator",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "location_bar_verbose_status_extra_space",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "location_bar_status_view_right_space",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "url_action_container",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.LinearLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "toolbar_buttons",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.LinearLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "optional_button_stub",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "menu_button_wrapper",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "tab_switcher_toolbar_stub",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "bottom_toolbar_tab_switcher_mode",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.LinearLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "grid_tab_switcher_view_holder_stub",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "message_container",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "status_indicator_stub",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "empty_container_stub",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "sheet_container",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "survey_container",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "page_zoom_container",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "dialog_parent_view",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "keyboard_accessory",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.LinearLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "accessory_bar_contents",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.LinearLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "tabs",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.HorizontalScrollView",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "menu_anchor_stub",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "navigation_popup_anchor_stub",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "action_mode_bar_stub",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
}
|
||||
],
|
||||
"PackageId": "com.vivaldi.browser",
|
||||
"WebDomain": "m.imdb.com"
|
||||
}
|
@@ -3,14 +3,15 @@ using Android.Content;
|
||||
|
||||
namespace keepass2android.Io
|
||||
{
|
||||
public partial class PCloudFileStorage: JavaFileStorage
|
||||
public class PCloudFileStorage: JavaFileStorage
|
||||
{
|
||||
private const string ClientId = "CkRWTQXY6Lm";
|
||||
|
||||
public PCloudFileStorage(Context ctx, IKp2aApp app) :
|
||||
base(new Keepass2android.Javafilestorage.PCloudFileStorage(ctx, ClientId), app)
|
||||
base(new Keepass2android.Javafilestorage.PCloudFileStorage(ctx, ClientId, "pcloud", ""), app)
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public override bool UserShouldBackup
|
||||
@@ -18,6 +19,23 @@ namespace keepass2android.Io
|
||||
get { return false; }
|
||||
}
|
||||
}
|
||||
public class PCloudFileStorageAll : JavaFileStorage
|
||||
{
|
||||
private const string ClientId = "FLm22de7bdS";
|
||||
|
||||
public PCloudFileStorageAll(Context ctx, IKp2aApp app) :
|
||||
base(new Keepass2android.Javafilestorage.PCloudFileStorage(ctx, ClientId, "pcloudall", "PCLOUDALL_"), app)
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
public override bool UserShouldBackup
|
||||
{
|
||||
get { return false; }
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
BIN
src/PCloudBindings/Jars/pcloud-sdk-android-1.8.1.aar
Normal file
BIN
src/PCloudBindings/Jars/pcloud-sdk-java-core-1.8.1.jar
Normal file
@@ -56,7 +56,7 @@
|
||||
<ItemGroup>
|
||||
<None Include="Jars\AboutJars.txt" />
|
||||
<None Include="Additions\AboutAdditions.txt" />
|
||||
<LibraryProjectZip Include="Jars\pcloud-sdk-android-1.2.0.aar" />
|
||||
<LibraryProjectZip Include="Jars\pcloud-sdk-android-1.8.1.aar" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<TransformFile Include="Transforms\Metadata.xml" />
|
||||
@@ -72,6 +72,6 @@
|
||||
</Target>
|
||||
-->
|
||||
<ItemGroup>
|
||||
<EmbeddedReferenceJar Include="Jars\pcloud-sdk-java-core-1.2.0.jar" />
|
||||
<EmbeddedReferenceJar Include="Jars\pcloud-sdk-java-core-1.8.1.jar" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
@@ -2,7 +2,7 @@
|
||||
<PropertyGroup>
|
||||
|
||||
|
||||
<Flavor>NoNet</Flavor>
|
||||
<xFlavor>Net</xFlavor>
|
||||
|
||||
</PropertyGroup>
|
||||
|
||||
|
@@ -47,8 +47,8 @@ dependencies {
|
||||
implementation('com.onedrive.sdk:onedrive-sdk-android:1.2.0') {
|
||||
transitive = false
|
||||
}
|
||||
implementation 'com.pcloud.sdk:java-core:1.2.0'
|
||||
implementation 'com.pcloud.sdk:android:1.2.0'
|
||||
implementation 'com.pcloud.sdk:java-core:1.8.1'
|
||||
implementation 'com.pcloud.sdk:android:1.8.1'
|
||||
implementation 'com.google.code.gson:gson:2.8.6'
|
||||
implementation 'com.microsoft.services.msa:msa-auth:0.8.6'
|
||||
implementation 'com.microsoft.aad:adal:1.14.0'
|
||||
|
@@ -22,6 +22,7 @@ import com.pcloud.sdk.ApiError;
|
||||
import com.pcloud.sdk.Authenticators;
|
||||
import com.pcloud.sdk.AuthorizationActivity;
|
||||
import com.pcloud.sdk.AuthorizationData;
|
||||
import com.pcloud.sdk.AuthorizationRequest;
|
||||
import com.pcloud.sdk.AuthorizationResult;
|
||||
import com.pcloud.sdk.Call;
|
||||
import com.pcloud.sdk.DataSource;
|
||||
@@ -47,11 +48,19 @@ public class PCloudFileStorage extends JavaFileStorageBase
|
||||
|
||||
private ApiClient apiClient;
|
||||
private String clientId;
|
||||
private String protocolId;
|
||||
|
||||
public PCloudFileStorage(Context ctx, String clientId) {
|
||||
///prefix for SHARED_PREF keys so we can distinguish between different instances
|
||||
private String sharedPrefPrefix;
|
||||
|
||||
public PCloudFileStorage(Context ctx, String clientId, String protocolId, String sharedPrefPrefix) {
|
||||
this.ctx = ctx;
|
||||
this.clientId = clientId;
|
||||
this.protocolId = protocolId;
|
||||
this.sharedPrefPrefix = sharedPrefPrefix;
|
||||
|
||||
this.apiClient = createApiClientFromSharedPrefs();
|
||||
android.util.Log.d("KP2A", "Init pcloud with protocol " + protocolId + ", prefix=" + sharedPrefPrefix + ", clientId=" + clientId);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -86,7 +95,8 @@ public class PCloudFileStorage extends JavaFileStorageBase
|
||||
|
||||
@Override
|
||||
public String getProtocolId() {
|
||||
return "pcloud";
|
||||
|
||||
return protocolId;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -228,11 +238,17 @@ public class PCloudFileStorage extends JavaFileStorageBase
|
||||
finishActivityWithSuccess(activity);
|
||||
} else if (!activity.getState().getBoolean("hasStartedAuth", false)) {
|
||||
Activity castedActivity = (Activity)activity;
|
||||
Intent authIntent = AuthorizationActivity.createIntent(castedActivity, this.clientId);
|
||||
AuthorizationRequest req = AuthorizationRequest.create()
|
||||
.setClientId(this.clientId)
|
||||
.setType(AuthorizationRequest.Type.TOKEN)
|
||||
.setForceAccessApproval(true)
|
||||
.build();
|
||||
Intent authIntent = AuthorizationActivity.createIntent(castedActivity, req);
|
||||
castedActivity.startActivityForResult(authIntent, PCLOUD_AUTHORIZATION_REQUEST_CODE);
|
||||
activity.getState().putBoolean("hasStartedAuth", true);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -273,7 +289,7 @@ public class PCloudFileStorage extends JavaFileStorageBase
|
||||
}
|
||||
|
||||
private ApiClient createApiClientFromSharedPrefs() {
|
||||
SharedPreferences prefs = this.ctx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
|
||||
SharedPreferences prefs = this.ctx.getSharedPreferences(sharedPrefPrefix + SHARED_PREF_NAME, Context.MODE_PRIVATE);
|
||||
String authToken = prefs.getString(SHARED_PREF_AUTH_TOKEN, null);
|
||||
String apiHost = prefs.getString(SHARED_PREF_API_HOST, null);
|
||||
return this.createApiClient(authToken, apiHost);
|
||||
|
@@ -24,6 +24,7 @@ import com.jcraft.jsch.UserInfo;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
|
||||
public class SftpStorage extends JavaFileStorageBase {
|
||||
|
||||
@@ -323,6 +324,8 @@ public class SftpStorage extends JavaFileStorageBase {
|
||||
jsch = new JSch();
|
||||
ConnectionInfo ci = splitStringToConnectionInfo(filename);
|
||||
|
||||
Log.d("KP2AJFS", "init SFTP");
|
||||
|
||||
String base_dir = getBaseDir();
|
||||
jsch.setKnownHosts(base_dir + "/known_hosts");
|
||||
|
||||
@@ -340,7 +343,9 @@ public class SftpStorage extends JavaFileStorageBase {
|
||||
|
||||
}
|
||||
|
||||
Log.e("KP2AJFS[thread]", "getting session...");
|
||||
Session session = jsch.getSession(ci.username, ci.host, ci.port);
|
||||
Log.e("KP2AJFS", "creating SftpUserInfo");
|
||||
UserInfo ui = new SftpUserInfo(ci.password,_appContext);
|
||||
session.setUserInfo(ui);
|
||||
|
||||
@@ -395,12 +400,16 @@ public class SftpStorage extends JavaFileStorageBase {
|
||||
ci.password = decode(userPwd.substring(userPwd.indexOf(":")+1));
|
||||
ci.host = ci.host.substring(ci.host.indexOf('@') + 1);
|
||||
ci.port = DEFAULT_SFTP_PORT;
|
||||
int portSeparatorIndex = ci.host.indexOf(":");
|
||||
int portSeparatorIndex = ci.host.lastIndexOf(":");
|
||||
if (portSeparatorIndex >= 0)
|
||||
{
|
||||
ci.port = Integer.parseInt(ci.host.substring(portSeparatorIndex+1));
|
||||
ci.host = ci.host.substring(0, portSeparatorIndex);
|
||||
}
|
||||
// Encode/decode required to support IPv6 (colons break host:port parse logic)
|
||||
// See Bug #2350
|
||||
ci.host = decode(ci.host);
|
||||
|
||||
ci.localPath = extractSessionPath(filename);
|
||||
return ci;
|
||||
}
|
||||
@@ -471,6 +480,10 @@ public class SftpStorage extends JavaFileStorageBase {
|
||||
|
||||
public String buildFullPath( String host, int port, String localPath, String username, String password) throws UnsupportedEncodingException
|
||||
{
|
||||
// Encode/decode required to support IPv6 (colons break host:port parse logic)
|
||||
// See Bug #2350
|
||||
host = encode(host);
|
||||
|
||||
if (port != DEFAULT_SFTP_PORT)
|
||||
host += ":"+String.valueOf(port);
|
||||
return getProtocolPrefix()+encode(username)+":"+encode(password)+"@"+host+localPath;
|
||||
|
@@ -34,7 +34,6 @@ public class SftpUserInfo implements UserInfo {
|
||||
builder.setContentText("SFTP prompt");
|
||||
builder.setSmallIcon(R.drawable.ic_logo_green_foreground);
|
||||
|
||||
|
||||
Handler h = new Handler() {
|
||||
public void handleMessage(Message M) {
|
||||
msg.copyFrom(M);
|
||||
@@ -51,8 +50,12 @@ public class SftpUserInfo implements UserInfo {
|
||||
intent.putExtra("keepass2android.sftp.prompt", text);
|
||||
intent.setData((Uri.parse("suckit://"+SystemClock.elapsedRealtime())));
|
||||
|
||||
|
||||
Log.e("KP2AJFS[thread]", "built after 2023-03-14");
|
||||
|
||||
int flags = 0;
|
||||
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
|
||||
Log.e("KP2AJFS[thread]", "Setting mutable flag...");
|
||||
flags |= PendingIntent.FLAG_MUTABLE;
|
||||
}
|
||||
PendingIntent contentIntent = PendingIntent.getActivity(_appContext, 0, intent, flags);
|
||||
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 6.0 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 7.9 KiB |
Before Width: | Height: | Size: 511 B After Width: | Height: | Size: 391 B |
Before Width: | Height: | Size: 760 B After Width: | Height: | Size: 634 B |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 913 B |
Before Width: | Height: | Size: 730 B After Width: | Height: | Size: 434 B |
Before Width: | Height: | Size: 940 B After Width: | Height: | Size: 540 B |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 461 B After Width: | Height: | Size: 277 B |
Before Width: | Height: | Size: 332 B After Width: | Height: | Size: 192 B |
Before Width: | Height: | Size: 498 B After Width: | Height: | Size: 326 B |
Before Width: | Height: | Size: 811 B After Width: | Height: | Size: 659 B |
Before Width: | Height: | Size: 715 B After Width: | Height: | Size: 442 B |
Before Width: | Height: | Size: 1001 B After Width: | Height: | Size: 577 B |
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 892 B |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 745 B After Width: | Height: | Size: 451 B |
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 614 B |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 903 B |
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 833 B After Width: | Height: | Size: 432 B |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 226 B After Width: | Height: | Size: 166 B |
Before Width: | Height: | Size: 807 B After Width: | Height: | Size: 507 B |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 690 B |
Before Width: | Height: | Size: 681 B After Width: | Height: | Size: 427 B |
Before Width: | Height: | Size: 548 B After Width: | Height: | Size: 345 B |
Before Width: | Height: | Size: 438 B After Width: | Height: | Size: 274 B |
Before Width: | Height: | Size: 200 B After Width: | Height: | Size: 152 B |
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 972 B |
Before Width: | Height: | Size: 379 B After Width: | Height: | Size: 227 B |
Before Width: | Height: | Size: 301 B After Width: | Height: | Size: 186 B |
Before Width: | Height: | Size: 404 B After Width: | Height: | Size: 237 B |
Before Width: | Height: | Size: 413 B After Width: | Height: | Size: 240 B |
Before Width: | Height: | Size: 341 B After Width: | Height: | Size: 214 B |
Before Width: | Height: | Size: 388 B After Width: | Height: | Size: 227 B |
Before Width: | Height: | Size: 413 B After Width: | Height: | Size: 244 B |
Before Width: | Height: | Size: 367 B After Width: | Height: | Size: 221 B |
Before Width: | Height: | Size: 417 B After Width: | Height: | Size: 246 B |
Before Width: | Height: | Size: 417 B After Width: | Height: | Size: 245 B |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 753 B |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 843 B |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 215 B After Width: | Height: | Size: 159 B |
Before Width: | Height: | Size: 1012 B After Width: | Height: | Size: 999 B |
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 6.1 KiB |
Before Width: | Height: | Size: 774 B After Width: | Height: | Size: 637 B |
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 3.9 KiB |