Skip to content

Commit

Permalink
[feature/shortcuts] iOS 13 Add Shortcut parameter support (#491)
Browse files Browse the repository at this point in the history
* Naming improvements based on latest SDK:
- uploads use new OCCoreOptionAutomaticConflictResolutionNameStyle option to automatically resolve naming conflicts during upload
- Duplicate action uses the new OCCore name suggestion API to
	- determine naming conflicts and resolve them automatically
	- match the name style of the file to duplicate, f.ex.
		- duplicating "File copy.jpg" will create "File copy 2.jpg"
		- duplicating "File (1).jpg" will create "File (2).jpg"
		- duplicating "File Kopie 2.jpg" will create "File Kopie 3.jpg"
- folder creation uses the new OCCore name suggestion API to
	- detect naming conflicts beforehand
	- pre-fill the new folder name name with an unused name directly

* #393 added an activity indicator which will be shown, if offline copies will be deleted to give the user a UI feedback

* - Change SDK branch to master

* #76 user can import files using the iOS share sheet. all file types are accepted.

* - using new SDK with fixes for requesting core
- minor code fixes

* - Log device, version and locale information at the beginning of every log file using new SDK protocol
- Show SDK commit hash in Settings

* fixed crash, changed bookmark name to shortname

* changed UIAlertViewController for account selection to CardViewController style for testing

* fixed icon badge creation for fastlane lane In-House Enterprise IPA generation

* install librsvg for fastlane via sh

* moved import file code to own class

* added option to automatically resolve name conflicts, if file name already exists

* Changed app version to 1.1.0

* enabled beta build and warning

*  Keep the gallery alive after doing some action over an item (#447)

* Rename updates the currently visible file in the gallery

* Keeping gallery alive fix

- Don’t pop to the root view controller on destructive action by default
- Only pop to the root if all items have been deleted
- Select next item upon deletion of the current ones
- Update UIPageViewController data source if number of items changes due e.g. to duplication or deletion

* Small fixes

* Fixed review findings

* Media player implemented using AVKit (#429)

* Media player implemented using AVKit

* Added possibility to stream audio / video

* Improved error handling

* Fixed review finding

* Added background audio, airplay and PiP mode

* Propagating safe area to the main view of AVPlayerViewController

* Another fix for safe area considering layout of AVPlayerViewController

* Updated to latest develop version of SDK

* Display error message in case file couldn’t be preview e.g. due to file corruption (#427)

* Fixed UI test for creating folder, need to return a fixed name, because suggestion is not working in tests

* added a description header and changed typo

* - fixed showing the directory picker controller, after the card view was dismissed
- use the current development SDK

* Version Bump to 126

* - create local copy of import file, if needed
- fixed create folder action
- delete local copy, if needed
- code review changes

* - improved duplicate item deletion behaviour
	- add additional safeguard so duplicate files are only deleted if they were actually duplicated (previously non-duplicate files could be removed if duplication or folder creation failed)
	- remove temporary container folder, too
- add 2 second delay before returning the core to give the core an opportunity to schedule the upload on a NSURLSession

* Version Bump to 127

* changed back signing identity

* Version Bump to 128

* added required CFBundleTypeName key

* Version Bump to 129

* updated changelog

* use formSheet presentation style for the iPad when showing the document picker

* Fix for images not being displayed in the gallery

* Version Bump to 130

* Version Bump to 131

* [fix/sharing-search] Fixed min length for searching sharing users (#455)

* #454 used correct comparator for sharingSearchMinLength and set a new default value, if capability does not exists

* added a constant for defaultSharingSearchMinLength value

* - Update ios-sdk to address finding (1) in ios-app #446

* Preventing updating UI in DisplayViewController while item is being changed

- Not calling present(item:) while meta data of OCItem is being updated
- Elliminated an assumption in MediaDisplayViewController that render renderSpecificView() can be called only once.
- Making sure that AVPlayer is not re-created upon changes in OCItem but that rather AVPlayerItem is replaced.

* Fixed a small warning

* Tried to improve gallery logic concerning items modification

- Watch out if the modification does still includes the item with local ID of the currently visible item.
- Take care of failed move but watching out for reappearing items

* Added a setting allowing to decide user if media files shall be streamed

* - Add debug output to Display*ViewController
- Fix SwiftLint warnings

* Fixed handling of deleted / moved item in the gallery

* Another small fix for handling of failed item move

* Version Bump to 132

* Added LSSupportsOpeningDocumentsInPlace key to Info.plist

* Fixed Info.plist and added LSHandlerRank property

* Fix for #455 issue: no search request triggered

* #463 Add Shortcut support with Parameters (iOS 13)

* fixed save file intent, use security scope for copying file

* added create folder intent action

* - removed progress instance variable
- added error completion handler

* added accept custom file types for parameter INFile

* show always the account selection sheet and added a note, that only one file can be imported at once

* use securtiy scoped file operation for importing a file

* Fix for the PR #447 (keep gallery alive) (#465)

* Keeping track of individual OCItems in DisplayViewController instances

But loading the list of items in the gallery only once and not reacting to any changes (moving, deleting)

* Removed query stop call in DisplayHostViewController

Since this query is not created there but just passed from the parent view.

* Removing more button if the currently viewed file got moved or deleted

* Fixed updating UI after renaming current item

* Fixed a warning

* Fixed issues in the gallery

* - Minor fixes

* [feature/bundle-import] Add support for certain bundle formats to the share sheet (#471)

* - Add support for import of bundle-based document formats through transparent zipping
	- moved previous FileProvider functionality into ownCloudApp.framework
	- new method OCCore.importItemNamed() ensures correct handling of bundle-based document formats
	- fixes finding (4) in #445
- Changed LSSupportsOpeningDocumentsInPlace to NO address two issues:
	- the app is now listed as "Copy to ownCloud" (previously "Open in ownCloud", which was technically not correct)
	- previously, documents using "Open to ownCloud" would no longer open in f.ex. Pages, but in the ownCloud app when selected in the Files app

* - Refactored ImportFilesController around using NSFileCoordinator, fixing finding (1) in #471

* changed path for moved Info.plist for target ownCloudAppFramework

* Version Bump to 133

* [feature/sort direction] Allow sorting asc/desc for all sort methods (#474)

* #470 added change sort direction asc/desc for all sort methods

* - removed comments
- changed translation keys

* fixes sort comparator for sort method "shared"

* use correct images for sort direction asc and desc

* updated choosing sort method from a tableView/Popover instead of a UIAlertViewController

* set maximum width for popover and set arrow direction

* Added show sort direction in UISegmentControl

* - make sure arrows of popovers appear in same color as the popover contents
- fix issue where direction was toggled during setup of SortBar (setting of initial value from user defaults), so logging in, logging out and logging in would change the sort direction
- reset sort direction to ascendant when switching sort methods
- SortMethodTableViewController
	- remove extraneous instance lets
	- enforce row height used for table view height calculation
	- change table view height calculation to account for the last divider (which could look a bit off if present)

* tap on segment control was fired twice, because there was a missing check, if selected segment changed

* fixed changing width on selecting an other segment

* fixed jumping width of sortSegmentControl items by setting the same width for all items by calculating the longest width before

* [fix/index-bar] Make Index Bar available in general file list (#469)

* #413 show index bar in general file list
- Index bar is only visible, if sorting is "Sort by name"
- Index bar is only visible, if more than one different letters are available
- Index bar is only visible, if more items are available as visible

* - adopt to new sort methods
- reverse index list, if sort direction is descendant

* Version Bump to 134

* Version Bump to 135

* Version Bump to 136

*  Change behaviour of default expiration date (#476)

* Enabling expiration date switch if default expiration date is configured

Checking files_sharing.public.expire_date.expire_date.days server capability. If it is set then it is used as default date and the switch is enabled even if the expiration date is not enforced.

* Fixed QA issue (1)

* Fixed QA finding (2): limiting the date range if expiration date is enforced

* Permission increasing UX in reshares (#467)

* Not showing permissions which can’t be elevated

Affecting items shared with the current users which are being reshared

* Fixed an issue with wrong permissions displayed when creating public link

- Checking if permissions can be elevated for the public link
- Only viable options are displayed

* Fixed a trailing whitespace warning

* Fixed another compiler warning

* Inhereting permissions from the share when creating public link

* Fixed QA finding (4)

* Fixed QA finding (1)

* Fixed QA finding (2)

* Version Bump to 137

* added Get File Info Intent

* [feature/itempolicy] Item Policy / Available Offline support (#456)

* Available Offline Support
- new MakeAvailableOfflineAction and MakeUnavailableOfflineAction actions
- new Available Offline Library section
	- easy access to all files available offline via Available Offline
	- new ItemPolicyTableViewController and ItemPolicyCell prepared for reuse for presenting other item policies
- Design: added SVG/TVG/PNG icons and cloud symbols for make available offline / make unavailable offline

ClientItemCell changes
- new ClientItemResolvingCell can resolve item from LocalID or path, new superclass of ShareClientItemCell and ItemPolicyCell
- string to use as content for title and detail are now provided via titleLabelString(for:) and detailLabelString(for:), updated via updateLabels(with:), making customization easier
- support for new available offline badge

ProgressSummarizer changes
- changed ProgressSummary from a struct to a class, addressing issue #451 ("Waiting for server response..." message sometimes not disappearing)

* - Adopt OCClaim to ensure files aren't deleted while they are being used in
	- DisplayViewController
	- DownloadItemsHUDViewController
	- FileListTableViewController
	- File Provider
- Add new Storage Settings to allow control over how long unused local copies are kept around
- DisplayViewController now uses OCClaims to ensure files aren't deleted while they are being viewed
- ClientItemCell uses new SDK APIs to
	- show "available offline" badges for folders
	- to indicate if an item has been made available offline directly (solid icon) or indirectly (dimmed icon)
	- keep the cloud status icon updated following changes
- Change "+" icon to "•••" icon in file list, rename plusButton to folderAction everywhere
- Action.provideAlertAction() now applies padding to images if necessary so their text aligns at the same horizontal offset
- Fix typo in BookmarkInfoViewController and change wording from "Delete Offline Copies" to "Delete Local Copies" for consistency
- Update swiftlint.yml to silence ownCloudScreenshotsTests warnings

* - Update ios-sdk

* - Make changes requested in code review, adding missing localizable strings and removing extraneous code

* - Update SDK

* - Add downloadTriggerIdentifier and availableOfflinePolicyCoverage as properties that trigger the update of an item's visual representation (addressing finding 6 in #456)
- Update make available offline action to use new convertExistingLocalDownloads option (addressing finding 2 in #456)
- Update SDK (addressing finding 5 in #456)

* Items in moved Available Offline folders should no longer be cleared locally and re-downloaded, following under the hood improvements in the ios-sdk

* - Add initial support for cookies via SDK update

* - Temporarily disable some UI tests broken due to lack of database running

* - Fix issue (11) in #456 by updating the lastUsed date of already downloaded items when they are viewed

* - Added slider type to StaticTableViewRow
- changed storage settings to allow picking a timeframe via slider rather than a list of time frames

* - Change text from "Remove" to "Make unavailable offline" in Quick Access > Available Offline list (addressing issue (9))

* - Update BookmarkInfoViewController to provide users with the choice to also remove local copies of items marked as Available Offline, issuing a warning and giving the users a way to cancel, addressing issue (12) in #456.

* - Update ios-sdk
- Take advantage of the new key-value store and OCCoreSkipAvailableOfflineKey to make sure available offline files are not immediately downloaded again after clearing the vault from local copies of available offline files.
- Logging into an account removes any previously set OCCoreSkipAvailableOfflineKey from the key value store
- Move Bookmark locking to an OCBookmarkManager category (next stop: use the new key-value store and bake support for locking bookmarks directly into the SDK)

* - Add missing localization

* Update SDK with latest fixes

* - Fix SettingsTests bugs

* - Apply additional fixes to UI tests and disable the remaining failing ones

* - Wait for connection initialization to complete before requesting sharing info
- Use latest SDK with cookie filtering

* - Turn off Request/Response log tags only filter in project file

* - Disable cookie support

* - Address (13) via SDK update

* link against newest development SDK

* Fixes for UI testing:
- use new SDK version that returns errors if the SQLite DB has not been opened
- MockOCCore.state now returns .running to avoid queueing of PROPFINDs

* - Fix unit tests

* - UI testing: make MockOCCore.state no longer return .running due to side effects
- fixed conflicting constraints in two places

* - force-delete bookmarks in UI tests if timeout has passed, log error but don't assert in that case
- handle case where a swipe on table cells in DeleteBookmarkTests triggers deletion outright

* - Further hardening of SettingsTests against timing differences local vs. CI

* - make SettingsTest.testCheckMoreItems() more robust

* - added error handling
- moving duplicated code into helper and extensions

* improved failure handling

* added Intent for checking if a given path exists

* improved variable check

* added Delete Item at Path Intent handler

* return path for created folder and saved file in shortcuts intents

* - changed all intent handler to provide accounts
- changed formatting for display name
- added "Get Account" intent
- added descriptions

* removed privateLink property from FileInfo

* - added sort type and sort direction WIP
- added error handling for account failure

* Implemented Sort Direction and Sort Type for Directory Listing

* adopt fastlane file for new "Intent" target

* code signing changes for fastlane

* - fixed validation errors on AppStore connect upload
- new build number
- fixed comments

(cherry picked from commit 5ccdebd)

* fixed crash on OS version below iOS 13

* removing type identifier, because files of type "text/plain" was not handled correct in Shortcuts.app. Instead of using text content, file name was used. Maybe this is a bug in iOS and will be submitted as bug report to Apple

(cherry picked from commit 3fd6f92)

* added optional parameter "filename" for SaveFileIntent

(cherry picked from commit 067ccd9)

* added setting optional file extension

* added localization support for Siri Intents

* Code refactoring after code review findings

* - code refactoring
- fixed duplicated symbols for intent definition

* - moved shared code from app to framework
- better error handling for some intents
- using newest SDK, which fixes path problems
- set parameter name, extension in SaveFileIntent to optional

* moved shared file to framework

* - Update SDK to include latest fixes, including for the latest "/Documents" vs "/Documents/" issue

* - correct the targeted commit for the ios-sdk git module
  • Loading branch information
hosy authored Nov 26, 2019
1 parent 02dfc02 commit 9143136
Show file tree
Hide file tree
Showing 37 changed files with 4,858 additions and 52 deletions.
32 changes: 30 additions & 2 deletions fastlane/Fastfile
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ platform :ios do
provisioningProfiles: {
"com.owncloud.ios-app" => "match AdHoc com.owncloud.ios-app",
"com.owncloud.ios-app.ownCloud-File-Provider" => "match AdHoc com.owncloud.ios-app.ownCloud-File-Provider",
"com.owncloud.ios-app.ownCloud-File-ProviderUI" => "match AdHoc com.owncloud.ios-app.ownCloud-File-ProviderUI"
"com.owncloud.ios-app.ownCloud-File-ProviderUI" => "match AdHoc com.owncloud.ios-app.ownCloud-File-ProviderUI",
"com.owncloud.ios-app.ownCloud-File-Intents" => "match AdHoc com.owncloud.ios-app.ownCloud-Intents"
#Add more Provisioning Profiles when extensions are added
}
}
Expand Down Expand Up @@ -71,6 +72,8 @@ platform :ios do
ENTERPRISE_FP_PROFILE = "Enterprise Distribution iOS Neo File Provider"
ENTERPRISE_FP_UI_ID = "com.owncloud.enterprise.ios-app.ownCloud-File-ProviderUI"
ENTERPRISE_FP_UI_PROFILE = "Enterprise Distribution iOS Neo File ProviderUI"
ENTERPRISE_INTENT_ID = "com.owncloud.enterprise.ios-app.ownCloud-Intents"
ENTERPRISE_INTENT_PROFILE = "Enterprise Distribution iOS Neo Intent"
ENTERPRISE_APP_FW_ID = "com.owncloud.enterprise.ownCloudApp"
ENTERPRISE_TEAM = "5QNK8L2PSC"
ENTERPRISE_IDENTITY = "iPhone Distribution: ownCloud GmbH"
Expand Down Expand Up @@ -99,6 +102,12 @@ platform :ios do
app_identifier: ENTERPRISE_APP_FW_ID
)

update_app_identifier(
xcodeproj: "ownCloud.xcodeproj",
plist_path: "ownCloud Intents/Info.plist",
app_identifier: ENTERPRISE_INTENT_ID
)

update_app_group_identifiers(
entitlements_file: "ownCloud/ownCloud.entitlements",
app_group_identifiers: ["group.com.owncloud.enterprise.ios-app"]
Expand All @@ -109,10 +118,18 @@ platform :ios do
app_group_identifiers: ["group.com.owncloud.enterprise.ios-app"]
)

update_app_group_identifiers(
entitlements_file: "ownCloud Intents/ownCloud Intents.entitlements",
app_group_identifiers: ["group.com.owncloud.enterprise.ios-app"]
)

set_info_plist_value(path: "ownCloud File Provider/Info.plist", key: "OCAppGroupIdentifier", value: "group.com.owncloud.enterprise.ios-app")
set_info_plist_value(path: "ownCloud File Provider/Info.plist", key: "OCKeychainAccessGroupIdentifier", value: "group.com.owncloud.enterprise.ios-app")
set_info_plist_value(path: "ownCloud File Provider/Info.plist", key: "NSExtension", subkey: "NSExtensionFileProviderDocumentGroup", value: "group.com.owncloud.enterprise.ios-app")

set_info_plist_value(path: "ownCloud Intents/Info.plist", key: "OCAppGroupIdentifier", value: "group.com.owncloud.enterprise.ios-app")
set_info_plist_value(path: "ownCloud Intents/Info.plist", key: "OCKeychainAccessGroupIdentifier", value: "group.com.owncloud.enterprise.ios-app")

automatic_code_signing(
path: "ownCloud.xcodeproj",
use_automatic_signing: false,
Expand Down Expand Up @@ -143,6 +160,16 @@ platform :ios do
targets: ["ownCloud File ProviderUI"]
)

automatic_code_signing(
path: "ownCloud.xcodeproj",
use_automatic_signing: false,
team_id: ENTERPRISE_TEAM,
code_sign_identity: ENTERPRISE_IDENTITY,
profile_name: ENTERPRISE_INTENT_PROFILE,
bundle_identifier: ENTERPRISE_INTENT_ID,
targets: ["ownCloud Intents"]
)

automatic_code_signing(
path: "ownCloud.xcodeproj",
use_automatic_signing: false,
Expand Down Expand Up @@ -172,7 +199,8 @@ platform :ios do
provisioningProfiles: {
ENTERPRISE_APP_ID => ENTERPRISE_APP_PROFILE,
ENTERPRISE_FP_ID => ENTERPRISE_FP_PROFILE,
ENTERPRISE_FP_UI_ID => ENTERPRISE_FP_UI_PROFILE
ENTERPRISE_FP_UI_ID => ENTERPRISE_FP_UI_PROFILE,
ENTERPRISE_INTENT_ID => ENTERPRISE_INTENT_PROFILE
}
}
)
Expand Down
58 changes: 58 additions & 0 deletions ownCloud Intents/Info.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>SiriKit</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>$(APP_SHORT_VERSION)</string>
<key>CFBundleVersion</key>
<string>140</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>IntentsRestrictedWhileLocked</key>
<array/>
<key>IntentsRestrictedWhileProtectedDataUnavailable</key>
<array/>
<key>IntentsSupported</key>
<array>
<string>CreateFolderIntent</string>
<string>DeletePathItemIntent</string>
<string>GetAccountIntent</string>
<string>GetAccountsIntent</string>
<string>GetDirectoryListingIntent</string>
<string>GetFileInfoIntent</string>
<string>GetFileIntent</string>
<string>PathExistsIntent</string>
<string>SaveFileIntent</string>
</array>
</dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.intents-service</string>
<key>NSExtensionPrincipalClass</key>
<string>$(PRODUCT_MODULE_NAME).IntentHandler</string>
</dict>
<key>OCAppGroupIdentifier</key>
<string>group.com.owncloud.ios-app</string>
<key>OCAppIdentifierPrefix</key>
<string>$(AppIdentifierPrefix)</string>
<key>OCHasFileProvider</key>
<true/>
<key>OCKeychainAccessGroupIdentifier</key>
<string>group.com.owncloud.ios-app</string>
</dict>
</plist>
47 changes: 47 additions & 0 deletions ownCloud Intents/IntentHandler.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
//
// IntentHandler.swift
// SiriKit
//
// Created by Matthias Hühne on 23.07.19.
// Copyright © 2019 ownCloud GmbH. All rights reserved.
//

/*
* Copyright (C) 2019, ownCloud GmbH.
*
* This code is covered by the GNU Public License Version 3.
*
* For distribution utilizing Apple mechanisms please see https://owncloud.org/contribute/iOS-license-exception/
* You should have received a copy of this license along with this program. If not, see <http://www.gnu.org/licenses/gpl-3.0.en.html>.
*
*/

import Intents
import ownCloudAppShared

class IntentHandler: INExtension {

override func handler(for intent: INIntent) -> Any {
if intent is GetAccountsIntent {
return GetAccountsIntentHandler()
} else if intent is GetAccountIntent {
return GetAccountIntentHandler()
} else if intent is GetDirectoryListingIntent {
return GetDirectoryListingIntentHandler()
} else if intent is GetFileIntent {
return GetFileIntentHandler()
} else if intent is SaveFileIntent {
return SaveFileIntentHandler()
} else if intent is CreateFolderIntent {
return CreateFolderIntentHandler()
} else if intent is GetFileInfoIntent {
return GetFileInfoIntentHandler()
} else if intent is PathExistsIntent {
return PathExistsIntentHandler()
} else if intent is DeletePathItemIntent {
return DeletePathItemIntentHandler()
}

fatalError("Unhandled intent type: \(intent)")
}
}
14 changes: 14 additions & 0 deletions ownCloud Intents/ownCloud Intents.entitlements
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.owncloud.ios-app</string>
</array>
<key>keychain-access-groups</key>
<array>
<string>$(AppIdentifierPrefix)group.com.owncloud.ios-app</string>
</array>
</dict>
</plist>
Loading

0 comments on commit 9143136

Please sign in to comment.