Marino Faggiana 6 years ago
parent
commit
386faddfb6

+ 12 - 0
Nextcloud.xcodeproj/project.pbxproj

@@ -276,6 +276,9 @@
 		F758B452212C516300515F55 /* Quadrilateral.swift in Sources */ = {isa = PBXBuildFile; fileRef = F758B439212C516300515F55 /* Quadrilateral.swift */; };
 		F758B453212C516300515F55 /* ReviewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F758B43B212C516300515F55 /* ReviewViewController.swift */; };
 		F758B454212C516300515F55 /* Transformable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F758B43D212C516300515F55 /* Transformable.swift */; };
+		F758B45A212C564000515F55 /* Scan.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F758B457212C564000515F55 /* Scan.storyboard */; };
+		F758B45E212C569D00515F55 /* ScanCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F758B45D212C569C00515F55 /* ScanCell.swift */; };
+		F758B460212C56A400515F55 /* ScanCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F758B45F212C56A400515F55 /* ScanCollectionView.swift */; };
 		F75AC2431F1F62450073EC19 /* NCManageAutoUploadFileName.swift in Sources */ = {isa = PBXBuildFile; fileRef = F75AC2421F1F62450073EC19 /* NCManageAutoUploadFileName.swift */; };
 		F75ADF451DC75FFE008A7347 /* CCLogin.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F75ADF441DC75FFE008A7347 /* CCLogin.storyboard */; };
 		F75AE3C71E9D12900088BB09 /* SwiftyAvatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F75AE3C61E9D12900088BB09 /* SwiftyAvatar.swift */; };
@@ -1034,6 +1037,9 @@
 		F758B439212C516300515F55 /* Quadrilateral.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Quadrilateral.swift; sourceTree = "<group>"; };
 		F758B43B212C516300515F55 /* ReviewViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReviewViewController.swift; sourceTree = "<group>"; };
 		F758B43D212C516300515F55 /* Transformable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Transformable.swift; sourceTree = "<group>"; };
+		F758B457212C564000515F55 /* Scan.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Scan.storyboard; sourceTree = "<group>"; };
+		F758B45D212C569C00515F55 /* ScanCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScanCell.swift; sourceTree = "<group>"; };
+		F758B45F212C56A400515F55 /* ScanCollectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScanCollectionView.swift; sourceTree = "<group>"; };
 		F75AC2421F1F62450073EC19 /* NCManageAutoUploadFileName.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCManageAutoUploadFileName.swift; sourceTree = "<group>"; };
 		F75ADF441DC75FFE008A7347 /* CCLogin.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = CCLogin.storyboard; sourceTree = "<group>"; };
 		F75AE3C61E9D12900088BB09 /* SwiftyAvatar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftyAvatar.swift; sourceTree = "<group>"; };
@@ -2375,6 +2381,9 @@
 		F758B41E212C516300515F55 /* Scan */ = {
 			isa = PBXGroup;
 			children = (
+				F758B45F212C56A400515F55 /* ScanCollectionView.swift */,
+				F758B45D212C569C00515F55 /* ScanCell.swift */,
+				F758B457212C564000515F55 /* Scan.storyboard */,
 				F758B41F212C516300515F55 /* WeScan */,
 			);
 			path = Scan;
@@ -3677,6 +3686,7 @@
 				F7D4233D1F0596AC009C9782 /* Reader-Button-N@3x.png in Resources */,
 				F73B4EF21F470D9100BBEE4B /* EUCTWFreq.tab in Resources */,
 				F700222C1EC479840080073F /* Custom.xcassets in Resources */,
+				F758B45A212C564000515F55 /* Scan.storyboard in Resources */,
 				F77B0EFE1D118A16002130FE /* CCUploadFromOtherUpp.storyboard in Resources */,
 				F7D4246E1F063B82009C9782 /* CTAssetsPickerController.bundle in Resources */,
 				F762CB991EACB84400B38484 /* icon-success.png in Resources */,
@@ -4047,6 +4057,7 @@
 				F738E8421F90FFD100F95C8E /* NCManageEndToEndEncryption.m in Sources */,
 				F73B4F091F470D9100BBEE4B /* nsEUCKRProber.cpp in Sources */,
 				F7D424711F063B82009C9782 /* CTAssetsViewControllerTransition.m in Sources */,
+				F758B460212C56A400515F55 /* ScanCollectionView.swift in Sources */,
 				F762CB021EACB66200B38484 /* XLFormSliderCell.m in Sources */,
 				F77B0E1B1D118A16002130FE /* CCGraphics.m in Sources */,
 				F70022CB1EC4C9100080073F /* OCSharedDto.m in Sources */,
@@ -4264,6 +4275,7 @@
 				F7CA1ED620E7E3FE002CC65E /* CALayer+PKDownloadButtonAnimations.m in Sources */,
 				F758B454212C516300515F55 /* Transformable.swift in Sources */,
 				F7ECBA6D1E239DCD003E6328 /* CCCreateCloud.swift in Sources */,
+				F758B45E212C569D00515F55 /* ScanCell.swift in Sources */,
 				F70022FE1EC4C9100080073F /* UtilsFramework.m in Sources */,
 				F7D424561F063B82009C9782 /* NSNumberFormatter+CTAssetsPickerController.m in Sources */,
 				F70022AA1EC4C9100080073F /* AFURLRequestSerialization.m in Sources */,

+ 4 - 3
iOSClient/Create/CCCreateCloud.swift

@@ -69,7 +69,7 @@ class CreateMenuAdd: NSObject {
             appDelegate.activeMain.openAssetsPickerController()
         })
         
-        if #available(iOS 10.0, *) {
+        if #available(iOS 11.0, *) {
             actionSheet.addButton(withTitle: NSLocalizedString("_scans_document_", comment: ""), image: CCGraphics.changeThemingColorImage(UIImage(named: "scan"), multiplier:2, color: colorGray), backgroundColor: NCBrandColor.sharedInstance.backgroundView, height: 50.0, type: AHKActionSheetButtonType.default, handler: {(AHKActionSheet) -> Void in
                 NCCreateScanDocument.sharedInstance.openScannerDocument(viewController: appDelegate.activeMain)
             })
@@ -705,13 +705,14 @@ class NCCreateScanDocument : NSObject, ImageScannerControllerDelegate {
         }
         
         let fileName = CCUtility.createFileName("scan", fileDate: Date(), fileType: PHAssetMediaType.image, keyFileName: k_keyFileNameMask, keyFileNameType: k_keyFileNameType, keyFileNameOriginal: k_keyFileNameOriginal)!
-        let fileNamePath = CCUtility.getDirectoryGroup().appendingPathComponent(k_DirectoryProviderStorage).appendingPathComponent(fileName)
+        let fileNamePath = CCUtility.getDirectoryPDFGenerator() + "/" + fileName
         
         do {
-            try UIImagePNGRepresentation(image)?.write(to: fileNamePath, options: .atomic)
+            try UIImagePNGRepresentation(image)?.write(to: NSURL.fileURL(withPath: fileNamePath), options: .atomic)
         } catch { }
         
         
+        
         //        let imageData = UIImageJPEGRepresentation(imageBN, 0.8)!
         //        try? imageData.write(to: fileNamePath)
         

+ 211 - 0
iOSClient/Scan/Scan.storyboard

@@ -0,0 +1,211 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14113" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="bdK-eL-mz4">
+    <device id="retina4_7" orientation="portrait">
+        <adaptation id="fullscreen"/>
+    </device>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <scenes>
+        <!--Drag and Drop - CollectionView-->
+        <scene sceneID="tne-QT-ifu">
+            <objects>
+                <viewController id="BYZ-38-t0r" customClass="DragDropViewController" customModule="Nextcloud" customModuleProvider="target" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="jwq-kF-6Nq">
+                                <rect key="frame" x="0.0" y="72" width="375" height="175"/>
+                                <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="175" id="0Wb-eO-Qiu"/>
+                                </constraints>
+                                <collectionViewFlowLayout key="collectionViewLayout" scrollDirection="horizontal" minimumLineSpacing="10" minimumInteritemSpacing="10" id="Dhy-fV-Qmr">
+                                    <size key="itemSize" width="171" height="171"/>
+                                    <size key="headerReferenceSize" width="0.0" height="0.0"/>
+                                    <size key="footerReferenceSize" width="0.0" height="0.0"/>
+                                    <inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
+                                </collectionViewFlowLayout>
+                                <cells>
+                                    <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="cell1" id="Lca-vD-NY2" customClass="DragDropCollectionViewCell" customModule="Nextcloud" customModuleProvider="target">
+                                        <rect key="frame" x="0.0" y="2" width="171" height="171"/>
+                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                        <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO">
+                                            <rect key="frame" x="0.0" y="0.0" width="171" height="171"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                            <subviews>
+                                                <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="sam-7M-bIk">
+                                                    <rect key="frame" x="0.0" y="0.0" width="171" height="171"/>
+                                                </imageView>
+                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="False Color" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8rT-k8-LDG">
+                                                    <rect key="frame" x="0.0" y="141" width="171" height="30"/>
+                                                    <color key="backgroundColor" white="0.0" alpha="0.39940068493150682" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                                    <constraints>
+                                                        <constraint firstAttribute="height" constant="30" id="Gt5-fB-Xuh"/>
+                                                    </constraints>
+                                                    <fontDescription key="fontDescription" name="AvenirNext-DemiBold" family="Avenir Next" pointSize="16"/>
+                                                    <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                                    <nil key="highlightedColor"/>
+                                                </label>
+                                                <imageView hidden="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="pin" translatesAutoresizingMaskIntoConstraints="NO" id="hal-g8-MFX">
+                                                    <rect key="frame" x="75" y="0.0" width="20" height="20"/>
+                                                    <constraints>
+                                                        <constraint firstAttribute="width" constant="20" id="Pgm-M8-yw8"/>
+                                                        <constraint firstAttribute="height" constant="20" id="xn4-R6-KKK"/>
+                                                    </constraints>
+                                                </imageView>
+                                            </subviews>
+                                        </view>
+                                        <constraints>
+                                            <constraint firstAttribute="trailing" secondItem="sam-7M-bIk" secondAttribute="trailing" id="8AX-l8-Lm0"/>
+                                            <constraint firstAttribute="bottom" secondItem="8rT-k8-LDG" secondAttribute="bottom" id="HkL-pv-AiK"/>
+                                            <constraint firstItem="8rT-k8-LDG" firstAttribute="leading" secondItem="Lca-vD-NY2" secondAttribute="leading" id="JSn-IA-OnC"/>
+                                            <constraint firstItem="sam-7M-bIk" firstAttribute="top" secondItem="Lca-vD-NY2" secondAttribute="top" id="YId-9R-Qgw"/>
+                                            <constraint firstItem="hal-g8-MFX" firstAttribute="centerX" secondItem="Lca-vD-NY2" secondAttribute="centerX" id="fq5-gq-RTm"/>
+                                            <constraint firstItem="hal-g8-MFX" firstAttribute="top" secondItem="Lca-vD-NY2" secondAttribute="top" id="oCn-ib-r5i"/>
+                                            <constraint firstItem="sam-7M-bIk" firstAttribute="leading" secondItem="Lca-vD-NY2" secondAttribute="leading" id="pbq-jr-YKl"/>
+                                            <constraint firstAttribute="trailing" secondItem="8rT-k8-LDG" secondAttribute="trailing" id="uov-gi-lrg"/>
+                                            <constraint firstAttribute="bottom" secondItem="sam-7M-bIk" secondAttribute="bottom" id="zD5-jG-EEP"/>
+                                        </constraints>
+                                        <connections>
+                                            <outlet property="customImageView" destination="sam-7M-bIk" id="mgQ-wh-sSH"/>
+                                            <outlet property="customLabel" destination="8rT-k8-LDG" id="p1z-pt-hc5"/>
+                                        </connections>
+                                    </collectionViewCell>
+                                </cells>
+                                <connections>
+                                    <outlet property="dataSource" destination="BYZ-38-t0r" id="NZe-jU-1hk"/>
+                                    <outlet property="delegate" destination="BYZ-38-t0r" id="B55-sR-2nI"/>
+                                </connections>
+                            </collectionView>
+                            <imageView userInteractionEnabled="NO" alpha="0.80000000000000004" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Cem-9x-d8O">
+                                <rect key="frame" x="0.0" y="257" width="375" height="410"/>
+                            </imageView>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Your Board" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YHy-9G-ngy">
+                                <rect key="frame" x="0.0" y="257" width="375" height="30"/>
+                                <color key="backgroundColor" white="1" alpha="0.5" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="30" id="vrg-ki-2Lk"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" name="AvenirNext-DemiBoldItalic" family="Avenir Next" pointSize="16"/>
+                                <nil key="textColor"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="fGo-qU-AYi">
+                                <rect key="frame" x="0.0" y="292" width="375" height="375"/>
+                                <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                <collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="10" minimumInteritemSpacing="10" id="9Sn-Y3-S86">
+                                    <size key="itemSize" width="100" height="100"/>
+                                    <size key="headerReferenceSize" width="0.0" height="0.0"/>
+                                    <size key="footerReferenceSize" width="0.0" height="0.0"/>
+                                    <inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
+                                </collectionViewFlowLayout>
+                                <cells>
+                                    <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="cell2" id="Pph-tY-PGX" customClass="DragDropCollectionViewCell" customModule="Nextcloud" customModuleProvider="target">
+                                        <rect key="frame" x="0.0" y="0.0" width="100" height="100"/>
+                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                        <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO">
+                                            <rect key="frame" x="0.0" y="0.0" width="100" height="100"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                            <subviews>
+                                                <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="sdV-W7-Hkd">
+                                                    <rect key="frame" x="0.0" y="0.0" width="100" height="100"/>
+                                                </imageView>
+                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="False Color" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="wcM-U8-GLh">
+                                                    <rect key="frame" x="0.0" y="80" width="100" height="20"/>
+                                                    <color key="backgroundColor" white="0.0" alpha="0.39940068490000002" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                                    <constraints>
+                                                        <constraint firstAttribute="height" constant="20" id="8He-ef-19r"/>
+                                                    </constraints>
+                                                    <fontDescription key="fontDescription" name="AvenirNext-DemiBold" family="Avenir Next" pointSize="11"/>
+                                                    <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                                    <nil key="highlightedColor"/>
+                                                </label>
+                                                <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="pin" translatesAutoresizingMaskIntoConstraints="NO" id="Oqn-2D-BJZ">
+                                                    <rect key="frame" x="37.5" y="0.0" width="25" height="25"/>
+                                                    <constraints>
+                                                        <constraint firstAttribute="height" constant="25" id="CIo-X0-2bG"/>
+                                                        <constraint firstAttribute="width" constant="25" id="G4M-4F-17k"/>
+                                                    </constraints>
+                                                </imageView>
+                                            </subviews>
+                                        </view>
+                                        <constraints>
+                                            <constraint firstItem="Oqn-2D-BJZ" firstAttribute="centerX" secondItem="Pph-tY-PGX" secondAttribute="centerX" id="707-32-Ywx"/>
+                                            <constraint firstItem="wcM-U8-GLh" firstAttribute="leading" secondItem="Pph-tY-PGX" secondAttribute="leading" id="EXk-95-OKd"/>
+                                            <constraint firstItem="sdV-W7-Hkd" firstAttribute="top" secondItem="Pph-tY-PGX" secondAttribute="top" id="G76-6T-Zpt"/>
+                                            <constraint firstAttribute="trailing" secondItem="sdV-W7-Hkd" secondAttribute="trailing" id="Jia-SE-8bu"/>
+                                            <constraint firstAttribute="bottom" secondItem="sdV-W7-Hkd" secondAttribute="bottom" id="Ljw-b9-Sp8"/>
+                                            <constraint firstItem="Oqn-2D-BJZ" firstAttribute="top" secondItem="Pph-tY-PGX" secondAttribute="top" id="U5w-vx-7AQ"/>
+                                            <constraint firstItem="sdV-W7-Hkd" firstAttribute="leading" secondItem="Pph-tY-PGX" secondAttribute="leading" id="kwQ-gl-6Bj"/>
+                                            <constraint firstAttribute="bottom" secondItem="wcM-U8-GLh" secondAttribute="bottom" id="qat-UY-DBH"/>
+                                            <constraint firstAttribute="trailing" secondItem="wcM-U8-GLh" secondAttribute="trailing" id="rLg-WD-x2l"/>
+                                        </constraints>
+                                        <connections>
+                                            <outlet property="customImageView" destination="sdV-W7-Hkd" id="edM-S1-vkM"/>
+                                            <outlet property="customLabel" destination="wcM-U8-GLh" id="BhF-OG-y3p"/>
+                                        </connections>
+                                    </collectionViewCell>
+                                </cells>
+                                <connections>
+                                    <outlet property="dataSource" destination="BYZ-38-t0r" id="8ul-vH-HVX"/>
+                                    <outlet property="delegate" destination="BYZ-38-t0r" id="ljh-bt-3WA"/>
+                                </connections>
+                            </collectionView>
+                        </subviews>
+                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                        <constraints>
+                            <constraint firstItem="YHy-9G-ngy" firstAttribute="leading" secondItem="Cem-9x-d8O" secondAttribute="leading" id="3bD-Za-YFV"/>
+                            <constraint firstItem="6Tk-OE-BBY" firstAttribute="trailing" secondItem="jwq-kF-6Nq" secondAttribute="trailing" id="6EM-YK-lEy"/>
+                            <constraint firstItem="fGo-qU-AYi" firstAttribute="top" secondItem="YHy-9G-ngy" secondAttribute="bottom" constant="5" id="8xQ-RJ-qkm"/>
+                            <constraint firstItem="Cem-9x-d8O" firstAttribute="top" secondItem="jwq-kF-6Nq" secondAttribute="bottom" constant="10" id="DAv-ec-qU8"/>
+                            <constraint firstItem="jwq-kF-6Nq" firstAttribute="leading" secondItem="6Tk-OE-BBY" secondAttribute="leading" id="ELU-RG-o16"/>
+                            <constraint firstItem="fGo-qU-AYi" firstAttribute="trailing" secondItem="6Tk-OE-BBY" secondAttribute="trailing" id="Ew2-9q-DKl"/>
+                            <constraint firstAttribute="bottom" secondItem="fGo-qU-AYi" secondAttribute="bottom" id="Eza-ZC-K9z"/>
+                            <constraint firstItem="YHy-9G-ngy" firstAttribute="top" secondItem="Cem-9x-d8O" secondAttribute="top" id="Rf5-5j-Ctt"/>
+                            <constraint firstItem="Cem-9x-d8O" firstAttribute="trailing" secondItem="fGo-qU-AYi" secondAttribute="trailing" id="SaR-bw-LHt"/>
+                            <constraint firstItem="Cem-9x-d8O" firstAttribute="bottom" secondItem="fGo-qU-AYi" secondAttribute="bottom" id="aJX-RZ-dYz"/>
+                            <constraint firstItem="fGo-qU-AYi" firstAttribute="leading" secondItem="6Tk-OE-BBY" secondAttribute="leading" id="aU0-Bn-B6T"/>
+                            <constraint firstItem="jwq-kF-6Nq" firstAttribute="top" secondItem="6Tk-OE-BBY" secondAttribute="top" constant="8" id="dyH-ym-lrb"/>
+                            <constraint firstItem="YHy-9G-ngy" firstAttribute="trailing" secondItem="Cem-9x-d8O" secondAttribute="trailing" id="naD-7x-WYn"/>
+                            <constraint firstItem="Cem-9x-d8O" firstAttribute="leading" secondItem="fGo-qU-AYi" secondAttribute="leading" id="rKz-dt-nW1"/>
+                        </constraints>
+                        <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
+                    </view>
+                    <navigationItem key="navigationItem" title="Drag and Drop - CollectionView" id="zeb-Ex-mE8"/>
+                    <connections>
+                        <outlet property="collectionView1" destination="jwq-kF-6Nq" id="Bur-i1-50r"/>
+                        <outlet property="collectionView2" destination="fGo-qU-AYi" id="TcD-xi-MVI"/>
+                    </connections>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="476" y="130.88455772113943"/>
+        </scene>
+        <!--Navigation Controller-->
+        <scene sceneID="CuH-8W-IGw">
+            <objects>
+                <navigationController automaticallyAdjustsScrollViewInsets="NO" id="bdK-eL-mz4" sceneMemberID="viewController">
+                    <toolbarItems/>
+                    <navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="xl6-fB-rBw">
+                        <rect key="frame" x="0.0" y="20" width="375" height="44"/>
+                        <autoresizingMask key="autoresizingMask"/>
+                    </navigationBar>
+                    <nil name="viewControllers"/>
+                    <connections>
+                        <segue destination="BYZ-38-t0r" kind="relationship" relationship="rootViewController" id="3p3-I3-fyK"/>
+                    </connections>
+                </navigationController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="93C-Sa-crZ" userLabel="First Responder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="-290" y="131"/>
+        </scene>
+    </scenes>
+    <resources>
+        <image name="pin" width="600" height="564"/>
+    </resources>
+</document>

+ 10 - 0
iOSClient/Scan/ScanCell.swift

@@ -0,0 +1,10 @@
+
+//
+
+import UIKit
+
+class ScanCell: UICollectionViewCell
+{
+    @IBOutlet weak var customImageView: UIImageView!
+    @IBOutlet weak var customLabel: UILabel!
+}

+ 254 - 0
iOSClient/Scan/ScanCollectionView.swift

@@ -0,0 +1,254 @@
+//
+//  DragDropViewController.swift
+//  DragAndDropInCollectionView
+//
+//  Created by Payal Gupta on 06/11/17.
+//  Copyright © 2017 Payal Gupta. All rights reserved.
+//
+
+import UIKit
+
+@available(iOS 11, *)
+
+class DragDropViewController: UIViewController
+{
+    //MARK: Private Properties
+    //Data Source for CollectionView-1
+    private var items1 = [String]()
+    
+    //Data Source for CollectionView-2
+    private var items2 = [String]()
+
+    //MARK: Outlets
+    @IBOutlet weak var collectionView1: UICollectionView!
+    @IBOutlet weak var collectionView2: UICollectionView!
+    
+    //MARK: View Lifecycle Methods
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        
+        //CollectionView-1 drag and drop configuration
+        self.collectionView1.dragInteractionEnabled = true
+        self.collectionView1.dragDelegate = self
+        self.collectionView1.dropDelegate = self
+        
+        //CollectionView-2 drag and drop configuration
+        self.collectionView2.dragInteractionEnabled = true
+        self.collectionView2.dropDelegate = self
+        self.collectionView2.dragDelegate = self
+        self.collectionView2.reorderingCadence = .fast //default value - .immediate
+        
+        loadImage()
+    }
+    
+    
+    private func loadImage() {
+        do {
+            let directoryContents = try FileManager.default.contentsOfDirectory(atPath: CCUtility.getDirectoryPDFGenerator()!)
+            for x in directoryContents {
+                
+            }
+        }
+        catch {
+            print(error.localizedDescription)
+        }
+    }
+    
+    
+    //MARK: Private Methods
+    
+    /// This method moves a cell from source indexPath to destination indexPath within the same collection view. It works for only 1 item. If multiple items selected, no reordering happens.
+    ///
+    /// - Parameters:
+    ///   - coordinator: coordinator obtained from performDropWith: UICollectionViewDropDelegate method
+    ///   - destinationIndexPath: indexpath of the collection view where the user drops the element
+    ///   - collectionView: collectionView in which reordering needs to be done.
+    private func reorderItems(coordinator: UICollectionViewDropCoordinator, destinationIndexPath: IndexPath, collectionView: UICollectionView)
+    {
+        let items = coordinator.items
+        if items.count == 1, let item = items.first, let sourceIndexPath = item.sourceIndexPath
+        {
+            var dIndexPath = destinationIndexPath
+            if dIndexPath.row >= collectionView.numberOfItems(inSection: 0)
+            {
+                dIndexPath.row = collectionView.numberOfItems(inSection: 0) - 1
+            }
+            collectionView.performBatchUpdates({
+                if collectionView === self.collectionView2
+                {
+                    self.items2.remove(at: sourceIndexPath.row)
+                    self.items2.insert(item.dragItem.localObject as! String, at: dIndexPath.row)
+                }
+                else
+                {
+                    self.items1.remove(at: sourceIndexPath.row)
+                    self.items1.insert(item.dragItem.localObject as! String, at: dIndexPath.row)
+                }
+                collectionView.deleteItems(at: [sourceIndexPath])
+                collectionView.insertItems(at: [dIndexPath])
+            })
+            coordinator.drop(items.first!.dragItem, toItemAt: dIndexPath)
+        }
+    }
+    
+    /// This method copies a cell from source indexPath in 1st collection view to destination indexPath in 2nd collection view. It works for multiple items.
+    ///
+    /// - Parameters:
+    ///   - coordinator: coordinator obtained from performDropWith: UICollectionViewDropDelegate method
+    ///   - destinationIndexPath: indexpath of the collection view where the user drops the element
+    ///   - collectionView: collectionView in which reordering needs to be done.
+    private func copyItems(coordinator: UICollectionViewDropCoordinator, destinationIndexPath: IndexPath, collectionView: UICollectionView)
+    {
+        collectionView.performBatchUpdates({
+            var indexPaths = [IndexPath]()
+            for (index, item) in coordinator.items.enumerated()
+            {
+                let indexPath = IndexPath(row: destinationIndexPath.row + index, section: destinationIndexPath.section)
+                if collectionView === self.collectionView2
+                {
+                    self.items2.insert(item.dragItem.localObject as! String, at: indexPath.row)
+                }
+                else
+                {
+                    self.items1.insert(item.dragItem.localObject as! String, at: indexPath.row)
+                }
+                indexPaths.append(indexPath)
+            }
+            collectionView.insertItems(at: indexPaths)
+        })
+    }
+}
+
+// MARK: - UICollectionViewDataSource Methods
+
+@available(iOS 11, *)
+
+extension DragDropViewController : UICollectionViewDataSource
+{
+    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
+    {
+        return collectionView == self.collectionView1 ? self.items1.count : self.items2.count
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
+    {
+        if collectionView == self.collectionView1
+        {
+            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell1", for: indexPath) as! ScanCell
+            cell.customImageView?.image = UIImage(named: self.items1[indexPath.row])
+            cell.customLabel.text = self.items1[indexPath.row].capitalized
+            return cell
+        }
+        else
+        {
+            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell2", for: indexPath) as! ScanCell
+            cell.customImageView?.image = UIImage(named: self.items2[indexPath.row])
+            cell.customLabel.text = self.items2[indexPath.row].capitalized
+            return cell
+        }
+    }
+}
+
+// MARK: - UICollectionViewDragDelegate Methods
+
+@available(iOS 11, *)
+
+extension DragDropViewController : UICollectionViewDragDelegate
+{
+    func collectionView(_ collectionView: UICollectionView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem]
+    {
+        let item = collectionView == collectionView1 ? self.items1[indexPath.row] : self.items2[indexPath.row]
+        let itemProvider = NSItemProvider(object: item as NSString)
+        let dragItem = UIDragItem(itemProvider: itemProvider)
+        dragItem.localObject = item
+        return [dragItem]
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, itemsForAddingTo session: UIDragSession, at indexPath: IndexPath, point: CGPoint) -> [UIDragItem]
+    {
+        let item = collectionView == collectionView1 ? self.items1[indexPath.row] : self.items2[indexPath.row]
+        let itemProvider = NSItemProvider(object: item as NSString)
+        let dragItem = UIDragItem(itemProvider: itemProvider)
+        dragItem.localObject = item
+        return [dragItem]
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, dragPreviewParametersForItemAt indexPath: IndexPath) -> UIDragPreviewParameters?
+    {
+        if collectionView == collectionView1
+        {
+            let previewParameters = UIDragPreviewParameters()
+            previewParameters.visiblePath = UIBezierPath(rect: CGRect(x: 25, y: 25, width: 120, height: 120))
+            return previewParameters
+        }
+        return nil
+    }
+}
+
+// MARK: - UICollectionViewDropDelegate Methods
+
+@available(iOS 11, *)
+
+extension DragDropViewController : UICollectionViewDropDelegate
+{
+    func collectionView(_ collectionView: UICollectionView, canHandle session: UIDropSession) -> Bool
+    {
+        return session.canLoadObjects(ofClass: NSString.self)
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, dropSessionDidUpdate session: UIDropSession, withDestinationIndexPath destinationIndexPath: IndexPath?) -> UICollectionViewDropProposal
+    {
+        if collectionView === self.collectionView1
+        {
+            if collectionView.hasActiveDrag
+            {
+                return UICollectionViewDropProposal(operation: .move, intent: .insertAtDestinationIndexPath)
+            }
+            else
+            {
+                return UICollectionViewDropProposal(operation: .forbidden)
+            }
+        }
+        else
+        {
+            if collectionView.hasActiveDrag
+            {
+                return UICollectionViewDropProposal(operation: .move, intent: .insertAtDestinationIndexPath)
+            }
+            else
+            {
+                return UICollectionViewDropProposal(operation: .copy, intent: .insertAtDestinationIndexPath)
+            }
+        }
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, performDropWith coordinator: UICollectionViewDropCoordinator)
+    {
+        let destinationIndexPath: IndexPath
+        if let indexPath = coordinator.destinationIndexPath
+        {
+            destinationIndexPath = indexPath
+        }
+        else
+        {
+            // Get last index path of table view.
+            let section = collectionView.numberOfSections - 1
+            let row = collectionView.numberOfItems(inSection: section)
+            destinationIndexPath = IndexPath(row: row, section: section)
+        }
+        
+        switch coordinator.proposal.operation
+        {
+        case .move:
+            self.reorderItems(coordinator: coordinator, destinationIndexPath:destinationIndexPath, collectionView: collectionView)
+            break
+            
+        case .copy:
+            self.copyItems(coordinator: coordinator, destinationIndexPath: destinationIndexPath, collectionView: collectionView)
+            
+        default:
+            return
+        }
+    }
+}
+

+ 2 - 0
iOSClient/Utility/CCUtility.h

@@ -199,6 +199,8 @@
 
 + (BOOL)isDocumentModifiableExtension:(NSString *)fileExtension;
 
++ (NSString *)getDirectoryPDFGenerator;
+
 // ===== E2E Encrypted =====
 
 + (NSString *)generateRandomIdentifier;

+ 10 - 0
iOSClient/Utility/CCUtility.m

@@ -1042,6 +1042,16 @@
     return [@[@"TXT", @"MD", @"MARKDOWN", @"ORG"] containsObject:fileExtension];
 }
 
++ (NSString *)getDirectoryPDFGenerator
+{
+    NSString *path = [[[CCUtility getDirectoryGroup] URLByAppendingPathComponent:k_appPDFGenerator] path];
+    
+    if (![[NSFileManager defaultManager] fileExistsAtPath:path])
+        [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
+    
+    return path;
+}
+
 #pragma --------------------------------------------------------------------------------------------
 #pragma mark ===== E2E Encrypted =====
 #pragma --------------------------------------------------------------------------------------------