Skip to content

Commit

Permalink
5th public release
Browse files Browse the repository at this point in the history
Refine(diag): scroll to the bottom of diagnostic log
Chore: update AppStore URL
Feat(autoFill): add manual search button to override autosuggestions (closes #9)
Fix(search): include protected custom field names in search results (#8)
Change(settings): set "Remember master keys" to true by default
Feat: show swiping hint when long-pressing an item
Feat(backup): limit backup age (closes #12)
Feat(settings): move backup settings to a dedicated page
Fix(sync): revert "Add workaround for crashes in revertToContentsOfURL" (#10, #13)
Feat(settings): add AutoFill settings page and setup instructions
Feat(settings): add "Copy TOTP on AutoFill" option
Feat(autoFill): copy TOTP before returning the credentials (closes #7)
Fix(settings): improve icon for backup settings
Docs: add attribution for the iOS Settings icon
Refine(settings): AppLockTimeout text colors and styles
Feat(watchdog): add AppLock timeout modes: .userIdle and .appMinimized
Feat(watchdog): add 3-second .appMinimized AppLock timeout (closes #14)
Refine(settings): improve wording and layout of settings VCs
Fix(db2): ignore nil ExpiryTime for non-expiring entries
  • Loading branch information
keepassium committed Jun 29, 2019
1 parent 23fd434 commit dd551eb
Show file tree
Hide file tree
Showing 68 changed files with 1,422 additions and 120 deletions.
24 changes: 24 additions & 0 deletions CHANGELOG.md
@@ -1,5 +1,29 @@
#CHANGELOG

## [1.0.26] (Public Beta) - 2019-06-29

### Added
- [Frequently asked questions](https://keepassium.com/faq)
- AutoFill setup instructions
- Option to lock the app not only immediately, but after a few seconds in background (closes #14) [thanks, J.B.]
- Option to automatically delete old backup copies (closes #12) [thanks, Dragonblitz10]
- Button in AutoFill to discard auto-suggestions and start manual search (closes #9) [thanks, Dragonblitz10]
- Option to copy OTP to clipboard when using AutoFill (closes #7) [thanks, Thunder33345]
- When long-pressing a file, suggest swiping instead [thanks, u/bananajoe]

### Changed
- "Remember master keys" option now defaults to "on" on first launch
- Manual search now checks the names of custom entry fields, even protected ones (related to #8)
- Moved backup setings to a separate page
- Refined the Settings screens

### Fixed
- Diagnostics viewer scrolls to bottom
- Error message animation in Create Database dialog [thanks, Tobias]
- Regression: files are not syncronized (#10, #13) [thanks, Sunil and AndiB.]
- Database loading error 'Nil value in Entry/Times/ExpiryTime' in some cases [thanks, u/yacob841]


## [1.0.25] (Public Beta) - 2019-06-19

### Fixed
Expand Down
2 changes: 1 addition & 1 deletion KeePassium AutoFill/Info.plist
Expand Up @@ -19,7 +19,7 @@
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>25</string>
<string>26</string>
<key>LSSupportsOpeningDocumentsInPlace</key>
<true/>
<key>NSExtension</key>
Expand Down
12 changes: 12 additions & 0 deletions KeePassium AutoFill/MainCoordinator.swift
Expand Up @@ -92,6 +92,18 @@ class MainCoordinator: NSObject, Coordinator {

func returnCredentials(entry: Entry) {
watchdog.restart()

let settings = Settings.current
if settings.isCopyTOTPOnAutoFill,
let totpGenerator = TOTPGeneratorFactory.makeGenerator(for: entry)
{
let totpString = totpGenerator.generate()
Clipboard.general.insert(
text: totpString,
timeout: TimeInterval(settings.clipboardTimeout.seconds)
)
}

let passwordCredential = ASPasswordCredential(user: entry.userName, password: entry.password)
rootController.extensionContext.completeRequest(
withSelectedCredential: passwordCredential,
Expand Down
14 changes: 14 additions & 0 deletions KeePassium AutoFill/controllers/DatabaseChooserVC.swift
Expand Up @@ -37,6 +37,11 @@ class DatabaseChooserVC: UITableViewController, Refreshable {
refreshControl.addTarget(self, action: #selector(refresh), for: .valueChanged)
self.refreshControl = refreshControl

let longPressGestureRecognizer = UILongPressGestureRecognizer(
target: self,
action: #selector(didLongPressTableView))
tableView.addGestureRecognizer(longPressGestureRecognizer)

refresh()
}

Expand Down Expand Up @@ -76,6 +81,15 @@ class DatabaseChooserVC: UITableViewController, Refreshable {
delegate?.databaseChooserShouldAddDatabase(self)
}

@objc func didLongPressTableView(_ gestureRecognizer: UILongPressGestureRecognizer) {
let point = gestureRecognizer.location(in: tableView)
guard gestureRecognizer.state == .began,
let indexPath = tableView.indexPathForRow(at: point),
tableView(tableView, canEditRowAt: indexPath),
let cell = tableView.cellForRow(at: indexPath) else { return }
cell.demoShowEditActions(lastActionColor: UIColor.destructiveTint)
}


override func numberOfSections(in tableView: UITableView) -> Int {
return 1
Expand Down
8 changes: 8 additions & 0 deletions KeePassium AutoFill/controllers/DiagnosticsViewerVC.swift
Expand Up @@ -52,9 +52,17 @@ class DiagnosticsViewerVC: UITableViewController {
tableView.rowHeight = UITableView.automaticDimension
items = Diag.itemsSnapshot()
super.viewDidLoad()

if items.count > 0 {
let lastRowIndexPath = IndexPath(row: items.count - 1, section: 0)
DispatchQueue.main.async {
self.tableView.scrollToRow(at: lastRowIndexPath, at: .none, animated: true)
}
}
}



@IBAction func didPressCopy(_ sender: Any) {
Watchdog.shared.restart()
let logText = Diag.toString()
Expand Down
14 changes: 14 additions & 0 deletions KeePassium AutoFill/controllers/EntryFinderVC.swift
Expand Up @@ -50,11 +50,19 @@ class EntryFinderVC: UITableViewController {
private var searchHelper = SearchHelper()
private var searchResults = SearchResults(exactMatch: [], partialMatch: [])
private var searchController: UISearchController!
private var manualSearchButton: UIBarButtonItem!

override func viewDidLoad() {
super.viewDidLoad()
self.clearsSelectionOnViewWillAppear = false
setupSearch()

manualSearchButton = UIBarButtonItem(
barButtonSystemItem: .search,
target: self,
action: #selector(didPressManualSearch))
navigationItem.rightBarButtonItem = manualSearchButton

refreshDatabaseName()
updateSearchCriteria()
}
Expand Down Expand Up @@ -211,6 +219,12 @@ class EntryFinderVC: UITableViewController {
}
}

@objc func didPressManualSearch(_ sender: Any) {
serviceIdentifiers.removeAll()
updateSearchCriteria()
searchController.searchBar.becomeFirstResponder()
}

@IBAction func didPressLockDatabase(_ sender: Any) {
Watchdog.shared.restart()
delegate?.entryFinderShouldLockDatabase(self)
Expand Down
14 changes: 14 additions & 0 deletions KeePassium AutoFill/controllers/KeyFileChooserVC.swift
Expand Up @@ -32,6 +32,11 @@ class KeyFileChooserVC: UITableViewController, Refreshable {
refreshControl.addTarget(self, action: #selector(refresh), for: .valueChanged)
self.refreshControl = refreshControl

let longPressGestureRecognizer = UILongPressGestureRecognizer(
target: self,
action: #selector(didLongPressTableView))
tableView.addGestureRecognizer(longPressGestureRecognizer)

refresh()
}

Expand Down Expand Up @@ -135,4 +140,13 @@ class KeyFileChooserVC: UITableViewController, Refreshable {
FileKeeper.shared.removeExternalReference(fileRef, fileType: .keyFile)
refresh()
}

@objc func didLongPressTableView(_ gestureRecognizer: UILongPressGestureRecognizer) {
let point = gestureRecognizer.location(in: tableView)
guard gestureRecognizer.state == .began,
let indexPath = tableView.indexPathForRow(at: point),
tableView(tableView, canEditRowAt: indexPath),
let cell = tableView.cellForRow(at: indexPath) else { return }
cell.demoShowEditActions(lastActionColor: UIColor.destructiveTint)
}
}
46 changes: 46 additions & 0 deletions KeePassium.xcodeproj/project.pbxproj
Expand Up @@ -8,6 +8,8 @@

/* Begin PBXBuildFile section */
750433AF2274CDD5000FE96B /* DatabaseCreatorCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 750433AE2274CDD5000FE96B /* DatabaseCreatorCoordinator.swift */; };
75065A3322C41B3A00958243 /* SettingsAutoFillVC.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 75065A3222C41B3A00958243 /* SettingsAutoFillVC.storyboard */; };
75065A3522C41B5200958243 /* SettingsAutoFillVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75065A3422C41B5200958243 /* SettingsAutoFillVC.swift */; };
750C683220D767F6001A6AA0 /* EditEntryVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 750C683120D767F6001A6AA0 /* EditEntryVC.swift */; };
750CFBC821BA9ACD00E62B09 /* AuthenticationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7550D231215D758800360E0C /* AuthenticationServices.framework */; };
750CFBCB21BA9ACD00E62B09 /* CredentialProviderViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 750CFBCA21BA9ACD00E62B09 /* CredentialProviderViewController.swift */; };
Expand Down Expand Up @@ -70,6 +72,12 @@
75779864223023D3006671BD /* ProgressViewHost.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75779863223023D3006671BD /* ProgressViewHost.swift */; };
75779865223023D3006671BD /* ProgressViewHost.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75779863223023D3006671BD /* ProgressViewHost.swift */; };
75781A2D20CA3D7A00BE474F /* SettingsFileSortingVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75781A2C20CA3D7A00BE474F /* SettingsFileSortingVC.swift */; };
7578487D22C02A9100BBEF9A /* UITableViewCell+demoEditActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7578487C22C02A9100BBEF9A /* UITableViewCell+demoEditActions.swift */; };
7578487E22C02A9100BBEF9A /* UITableViewCell+demoEditActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7578487C22C02A9100BBEF9A /* UITableViewCell+demoEditActions.swift */; };
7578488422C165B700BBEF9A /* SettingsBackupVC.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7578488322C165B700BBEF9A /* SettingsBackupVC.storyboard */; };
7578488622C165C900BBEF9A /* SettingsBackupVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7578488522C165C900BBEF9A /* SettingsBackupVC.swift */; };
7578488D22C1DFC400BBEF9A /* SettingsBackupTimeoutPickerVC.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7578488C22C1DFC400BBEF9A /* SettingsBackupTimeoutPickerVC.storyboard */; };
7578488F22C1DFF400BBEF9A /* SettingsBackupTimeoutPickerVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7578488E22C1DFF400BBEF9A /* SettingsBackupTimeoutPickerVC.swift */; };
757D336120EF382D000A47F0 /* SettingsDatabaseTimeoutVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 757D336020EF382D000A47F0 /* SettingsDatabaseTimeoutVC.swift */; };
757D336320EF5081000A47F0 /* SettingsClipboardTimeoutVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 757D336220EF5081000A47F0 /* SettingsClipboardTimeoutVC.swift */; };
757EF2F520EB3D1C0024AACD /* PasswordGeneratorVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 757EF2F420EB3D1C0024AACD /* PasswordGeneratorVC.swift */; };
Expand Down Expand Up @@ -198,6 +206,8 @@

/* Begin PBXFileReference section */
750433AE2274CDD5000FE96B /* DatabaseCreatorCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseCreatorCoordinator.swift; sourceTree = "<group>"; };
75065A3222C41B3A00958243 /* SettingsAutoFillVC.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = SettingsAutoFillVC.storyboard; sourceTree = "<group>"; };
75065A3422C41B5200958243 /* SettingsAutoFillVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsAutoFillVC.swift; sourceTree = "<group>"; };
750C683120D767F6001A6AA0 /* EditEntryVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditEntryVC.swift; sourceTree = "<group>"; };
750CFBC721BA9ACD00E62B09 /* KeePassium AutoFill.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "KeePassium AutoFill.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
750CFBCA21BA9ACD00E62B09 /* CredentialProviderViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CredentialProviderViewController.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -252,6 +262,11 @@
756FF64320BAB20300FF890B /* UIColor+namedColors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+namedColors.swift"; sourceTree = "<group>"; };
75779863223023D3006671BD /* ProgressViewHost.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressViewHost.swift; sourceTree = "<group>"; };
75781A2C20CA3D7A00BE474F /* SettingsFileSortingVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsFileSortingVC.swift; sourceTree = "<group>"; };
7578487C22C02A9100BBEF9A /* UITableViewCell+demoEditActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITableViewCell+demoEditActions.swift"; sourceTree = "<group>"; };
7578488322C165B700BBEF9A /* SettingsBackupVC.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = SettingsBackupVC.storyboard; sourceTree = "<group>"; };
7578488522C165C900BBEF9A /* SettingsBackupVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsBackupVC.swift; sourceTree = "<group>"; };
7578488C22C1DFC400BBEF9A /* SettingsBackupTimeoutPickerVC.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = SettingsBackupTimeoutPickerVC.storyboard; sourceTree = "<group>"; };
7578488E22C1DFF400BBEF9A /* SettingsBackupTimeoutPickerVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsBackupTimeoutPickerVC.swift; sourceTree = "<group>"; };
757D336020EF382D000A47F0 /* SettingsDatabaseTimeoutVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsDatabaseTimeoutVC.swift; sourceTree = "<group>"; };
757D336220EF5081000A47F0 /* SettingsClipboardTimeoutVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsClipboardTimeoutVC.swift; sourceTree = "<group>"; };
757EF2F420EB3D1C0024AACD /* PasswordGeneratorVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordGeneratorVC.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -362,6 +377,15 @@
name = Frameworks;
sourceTree = "<group>";
};
75065A3122C41B2200958243 /* autoFill */ = {
isa = PBXGroup;
children = (
75065A3222C41B3A00958243 /* SettingsAutoFillVC.storyboard */,
75065A3422C41B5200958243 /* SettingsAutoFillVC.swift */,
);
path = autoFill;
sourceTree = "<group>";
};
750CFBC921BA9ACD00E62B09 /* KeePassium AutoFill */ = {
isa = PBXGroup;
children = (
Expand All @@ -380,7 +404,9 @@
7546FBC420C1024200C5D834 /* settings */ = {
isa = PBXGroup;
children = (
75065A3122C41B2200958243 /* autoFill */,
75C3800F217A0497006F74C2 /* appLock */,
7578488722C16D7D00BBEF9A /* backup */,
7546FBC520C1027700C5D834 /* SettingsVC.swift */,
7546FBC920C104EE00C5D834 /* SettingsVC.storyboard */,
75781A2C20CA3D7A00BE474F /* SettingsFileSortingVC.swift */,
Expand Down Expand Up @@ -447,6 +473,7 @@
75C5C3752129DE0800CD7FE3 /* UIAlertController+extensions.swift */,
756FF64320BAB20300FF890B /* UIColor+namedColors.swift */,
755E9C4C20BE5DC200FD7C7A /* UIImage+extensions.swift */,
7578487C22C02A9100BBEF9A /* UITableViewCell+demoEditActions.swift */,
75C3801A217A0B76006F74C2 /* UIViewController+storyboard.swift */,
7542D2412129640F00C8A926 /* String+extensions.swift */,
7523F71C21C98D620025C706 /* SupportEmailComposer.swift */,
Expand Down Expand Up @@ -523,6 +550,17 @@
path = database;
sourceTree = "<group>";
};
7578488722C16D7D00BBEF9A /* backup */ = {
isa = PBXGroup;
children = (
7578488522C165C900BBEF9A /* SettingsBackupVC.swift */,
7578488322C165B700BBEF9A /* SettingsBackupVC.storyboard */,
7578488E22C1DFF400BBEF9A /* SettingsBackupTimeoutPickerVC.swift */,
7578488C22C1DFC400BBEF9A /* SettingsBackupTimeoutPickerVC.storyboard */,
);
path = backup;
sourceTree = "<group>";
};
758BF0D920D21EE500897C83 /* general */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -743,11 +781,13 @@
75C38047217A3254006F74C2 /* ChooseDatabaseVC.storyboard in Resources */,
75C38033217A26DC006F74C2 /* AboutVC.storyboard in Resources */,
754BF08D2082A6BD00E3A292 /* LaunchScreen.storyboard in Resources */,
7578488422C165B700BBEF9A /* SettingsBackupVC.storyboard in Resources */,
75C38041217A284A006F74C2 /* ChooseKeyFileVC.storyboard in Resources */,
75C3800E217A0344006F74C2 /* SettingsItemListVC.storyboard in Resources */,
75C38039217A27A7006F74C2 /* ChooseIconVC.storyboard in Resources */,
75C38013217A053D006F74C2 /* SettingsAppTimeoutVC.storyboard in Resources */,
75C38021217A1F0A006F74C2 /* ViewEntryFieldsVC.storyboard in Resources */,
7578488D22C1DFC400BBEF9A /* SettingsBackupTimeoutPickerVC.storyboard in Resources */,
75C38035217A271B006F74C2 /* ViewDiagnosticsVC.storyboard in Resources */,
75C3801F217A1EE1006F74C2 /* EditEntryVC.storyboard in Resources */,
75C3803D217A27FE006F74C2 /* ChangeMasterKeyVC.storyboard in Resources */,
Expand All @@ -767,6 +807,7 @@
75C38045217A3204006F74C2 /* PlaceholderVC.storyboard in Resources */,
75C38017217A0750006F74C2 /* SettingsDatabaseTimeoutVC.storyboard in Resources */,
75C3800C217A02DD006F74C2 /* SettingsFileSortingVC.storyboard in Resources */,
75065A3322C41B3A00958243 /* SettingsAutoFillVC.storyboard in Resources */,
75C3803F217A281D006F74C2 /* UnlockDatabaseVC.storyboard in Resources */,
75C38019217A078D006F74C2 /* SettingsClipboardTimeoutVC.storyboard in Resources */,
752ED68B2235543F00C20D3E /* SettingsDataProtectionVC.storyboard in Resources */,
Expand All @@ -790,6 +831,7 @@
75CBAB9F21C1671F00B8AFE2 /* MainCoordinator.swift in Sources */,
75D3A3B121BAE66F00255FC3 /* DatabaseFileListCell.swift in Sources */,
7523F71521C94DD90025C706 /* DiagnosticsViewerVC.swift in Sources */,
7578487E22C02A9100BBEF9A /* UITableViewCell+demoEditActions.swift in Sources */,
75B24DBA21C3CADB003C9486 /* EntryFinderVC.swift in Sources */,
750CFC0921BADBA500E62B09 /* DatabaseChooserVC.swift in Sources */,
757FB3CD21F9C50700F016FA /* ValidatingTextField.swift in Sources */,
Expand Down Expand Up @@ -873,6 +915,8 @@
75CD364121537A320018AF46 /* AppStoreReviewHelper.swift in Sources */,
75B5FB7720D53EA700D402D9 /* ViewEntryFieldsVC.swift in Sources */,
75B3B7BC20EABD9D007E8FA9 /* PlaceholderVC.swift in Sources */,
7578488622C165C900BBEF9A /* SettingsBackupVC.swift in Sources */,
75065A3522C41B5200958243 /* SettingsAutoFillVC.swift in Sources */,
7546FBD920C3A3F600C5D834 /* Watchdog.swift in Sources */,
75CA73912144381200ADAD64 /* KeyboardLayoutConstraint.swift in Sources */,
757FB3CA21F8D34A00F016FA /* PasscodeInputVC.swift in Sources */,
Expand All @@ -881,10 +925,12 @@
7529EAE9211416170093B117 /* SettingsAppLockVC.swift in Sources */,
758BF0D820D1B1DA00897C83 /* ValidatingTextField.swift in Sources */,
754BF09A20984DEE00E3A292 /* UnlockDatabaseVC.swift in Sources */,
7578488F22C1DFF400BBEF9A /* SettingsBackupTimeoutPickerVC.swift in Sources */,
75C5C3762129DE0800CD7FE3 /* UIAlertController+extensions.swift in Sources */,
75F4ACFC21776F4800B22D8B /* LString.swift in Sources */,
750D127E20CF071600BE0CCE /* EditGroupVC.swift in Sources */,
75C94C5B20B4B8C2004FA29D /* ViewEntryVC.swift in Sources */,
7578487D22C02A9100BBEF9A /* UITableViewCell+demoEditActions.swift in Sources */,
75779864223023D3006671BD /* ProgressViewHost.swift in Sources */,
7596771E20FB36BD00E54827 /* SettingsAppTimeoutVC.swift in Sources */,
7546FBDB20C3AC5E00C5D834 /* main.swift in Sources */,
Expand Down
6 changes: 6 additions & 0 deletions KeePassium/Assets.xcassets/autofill-onboarding/Contents.json
@@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "ios-settings_iconfinder-2697651_29@1.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ios-settings_iconfinder-2697651_29@2.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ios-settings_iconfinder-2697651_29@3.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
@@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "passwords_ownwork_29@1.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "passwords_ownwork_29@2.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "passwords_ownwork_29@3.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
@@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "autofill_ownwork_29@1.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "autofill_ownwork_29@2.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "autofill_ownwork_29@3.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit dd551eb

Please sign in to comment.