diff --git a/Brand/Custom.xcassets/intro1.imageset/Contents.json b/Brand/Custom.xcassets/intro1.imageset/Contents.json
deleted file mode 100644
index 9b5a868724..0000000000
--- a/Brand/Custom.xcassets/intro1.imageset/Contents.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "images" : [
- {
- "filename" : "intro1.svg",
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Brand/Custom.xcassets/intro1.imageset/intro1.svg b/Brand/Custom.xcassets/intro1.imageset/intro1.svg
deleted file mode 100644
index 076f295e4d..0000000000
--- a/Brand/Custom.xcassets/intro1.imageset/intro1.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/Brand/Custom.xcassets/intro2.imageset/Contents.json b/Brand/Custom.xcassets/intro2.imageset/Contents.json
deleted file mode 100644
index b56c247bbc..0000000000
--- a/Brand/Custom.xcassets/intro2.imageset/Contents.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "images" : [
- {
- "filename" : "intro2.png",
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Brand/Custom.xcassets/intro2.imageset/intro2.png b/Brand/Custom.xcassets/intro2.imageset/intro2.png
deleted file mode 100644
index 6cf5f76ae7..0000000000
Binary files a/Brand/Custom.xcassets/intro2.imageset/intro2.png and /dev/null differ
diff --git a/Brand/Custom.xcassets/intro3.imageset/Contents.json b/Brand/Custom.xcassets/intro3.imageset/Contents.json
deleted file mode 100644
index 973ded86a5..0000000000
--- a/Brand/Custom.xcassets/intro3.imageset/Contents.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "images" : [
- {
- "filename" : "intro3.png",
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Brand/Custom.xcassets/intro3.imageset/intro3.png b/Brand/Custom.xcassets/intro3.imageset/intro3.png
deleted file mode 100644
index 0c6e078c99..0000000000
Binary files a/Brand/Custom.xcassets/intro3.imageset/intro3.png and /dev/null differ
diff --git a/Brand/Custom.xcassets/intro4.imageset/Contents.json b/Brand/Custom.xcassets/intro4.imageset/Contents.json
deleted file mode 100644
index ea407c2d00..0000000000
--- a/Brand/Custom.xcassets/intro4.imageset/Contents.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "images" : [
- {
- "filename" : "intro4.png",
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Brand/Custom.xcassets/intro4.imageset/intro4.png b/Brand/Custom.xcassets/intro4.imageset/intro4.png
deleted file mode 100644
index 30a81f0b26..0000000000
Binary files a/Brand/Custom.xcassets/intro4.imageset/intro4.png and /dev/null differ
diff --git a/Brand/Custom.xcassets/introSlide1.imageset/Contents.json b/Brand/Custom.xcassets/introSlide1.imageset/Contents.json
new file mode 100644
index 0000000000..65b05047b7
--- /dev/null
+++ b/Brand/Custom.xcassets/introSlide1.imageset/Contents.json
@@ -0,0 +1,33 @@
+{
+ "images" : [
+ {
+ "filename" : "introSlide1.png",
+ "idiom" : "iphone",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "introSlide1@2x.png",
+ "idiom" : "iphone",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "introSlide1@3x.png",
+ "idiom" : "iphone",
+ "scale" : "3x"
+ },
+ {
+ "filename" : "Tablet Portrait - first slide-1.png",
+ "idiom" : "ipad",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "Tablet Portrait - first slide.png",
+ "idiom" : "ipad",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Brand/Custom.xcassets/introSlide1.imageset/Tablet Portrait - first slide-1.png b/Brand/Custom.xcassets/introSlide1.imageset/Tablet Portrait - first slide-1.png
new file mode 100644
index 0000000000..8a6354f8e9
Binary files /dev/null and b/Brand/Custom.xcassets/introSlide1.imageset/Tablet Portrait - first slide-1.png differ
diff --git a/Brand/Custom.xcassets/introSlide1.imageset/Tablet Portrait - first slide.png b/Brand/Custom.xcassets/introSlide1.imageset/Tablet Portrait - first slide.png
new file mode 100644
index 0000000000..8a6354f8e9
Binary files /dev/null and b/Brand/Custom.xcassets/introSlide1.imageset/Tablet Portrait - first slide.png differ
diff --git a/Brand/Custom.xcassets/introSlide1.imageset/introSlide1.png b/Brand/Custom.xcassets/introSlide1.imageset/introSlide1.png
new file mode 100644
index 0000000000..7ad97b76bc
Binary files /dev/null and b/Brand/Custom.xcassets/introSlide1.imageset/introSlide1.png differ
diff --git a/Brand/Custom.xcassets/introSlide1.imageset/introSlide1@2x.png b/Brand/Custom.xcassets/introSlide1.imageset/introSlide1@2x.png
new file mode 100644
index 0000000000..7ad97b76bc
Binary files /dev/null and b/Brand/Custom.xcassets/introSlide1.imageset/introSlide1@2x.png differ
diff --git a/Brand/Custom.xcassets/introSlide1.imageset/introSlide1@3x.png b/Brand/Custom.xcassets/introSlide1.imageset/introSlide1@3x.png
new file mode 100644
index 0000000000..271ec26fda
Binary files /dev/null and b/Brand/Custom.xcassets/introSlide1.imageset/introSlide1@3x.png differ
diff --git a/Brand/Custom.xcassets/introSlide2.imageset/Contents.json b/Brand/Custom.xcassets/introSlide2.imageset/Contents.json
new file mode 100644
index 0000000000..6f14cfcd17
--- /dev/null
+++ b/Brand/Custom.xcassets/introSlide2.imageset/Contents.json
@@ -0,0 +1,33 @@
+{
+ "images" : [
+ {
+ "filename" : "introSlide2.png",
+ "idiom" : "iphone",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "introSlide2@2x.png",
+ "idiom" : "iphone",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "introSlide2@3x.png",
+ "idiom" : "iphone",
+ "scale" : "3x"
+ },
+ {
+ "filename" : "Tablet Portrait - third slide-1.png",
+ "idiom" : "ipad",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "Tablet Portrait - third slide.png",
+ "idiom" : "ipad",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Brand/Custom.xcassets/introSlide2.imageset/Tablet Portrait - third slide-1.png b/Brand/Custom.xcassets/introSlide2.imageset/Tablet Portrait - third slide-1.png
new file mode 100644
index 0000000000..58357b3fb7
Binary files /dev/null and b/Brand/Custom.xcassets/introSlide2.imageset/Tablet Portrait - third slide-1.png differ
diff --git a/Brand/Custom.xcassets/introSlide2.imageset/Tablet Portrait - third slide.png b/Brand/Custom.xcassets/introSlide2.imageset/Tablet Portrait - third slide.png
new file mode 100644
index 0000000000..58357b3fb7
Binary files /dev/null and b/Brand/Custom.xcassets/introSlide2.imageset/Tablet Portrait - third slide.png differ
diff --git a/Brand/Custom.xcassets/introSlide2.imageset/introSlide2.png b/Brand/Custom.xcassets/introSlide2.imageset/introSlide2.png
new file mode 100644
index 0000000000..df3e9d9339
Binary files /dev/null and b/Brand/Custom.xcassets/introSlide2.imageset/introSlide2.png differ
diff --git a/Brand/Custom.xcassets/introSlide2.imageset/introSlide2@2x.png b/Brand/Custom.xcassets/introSlide2.imageset/introSlide2@2x.png
new file mode 100644
index 0000000000..df3e9d9339
Binary files /dev/null and b/Brand/Custom.xcassets/introSlide2.imageset/introSlide2@2x.png differ
diff --git a/Brand/Custom.xcassets/introSlide2.imageset/introSlide2@3x.png b/Brand/Custom.xcassets/introSlide2.imageset/introSlide2@3x.png
new file mode 100644
index 0000000000..17bf5d89a4
Binary files /dev/null and b/Brand/Custom.xcassets/introSlide2.imageset/introSlide2@3x.png differ
diff --git a/Brand/Custom.xcassets/introSlide3.imageset/Contents.json b/Brand/Custom.xcassets/introSlide3.imageset/Contents.json
new file mode 100644
index 0000000000..e15a5bbe53
--- /dev/null
+++ b/Brand/Custom.xcassets/introSlide3.imageset/Contents.json
@@ -0,0 +1,33 @@
+{
+ "images" : [
+ {
+ "filename" : "introSlide3.png",
+ "idiom" : "iphone",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "introSlide3@2x.png",
+ "idiom" : "iphone",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "introSlide3@3x.png",
+ "idiom" : "iphone",
+ "scale" : "3x"
+ },
+ {
+ "filename" : "Tablet Portrait - second slide-1.png",
+ "idiom" : "ipad",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "Tablet Portrait - second slide.png",
+ "idiom" : "ipad",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Brand/Custom.xcassets/introSlide3.imageset/Tablet Portrait - second slide-1.png b/Brand/Custom.xcassets/introSlide3.imageset/Tablet Portrait - second slide-1.png
new file mode 100644
index 0000000000..395767ba7f
Binary files /dev/null and b/Brand/Custom.xcassets/introSlide3.imageset/Tablet Portrait - second slide-1.png differ
diff --git a/Brand/Custom.xcassets/introSlide3.imageset/Tablet Portrait - second slide.png b/Brand/Custom.xcassets/introSlide3.imageset/Tablet Portrait - second slide.png
new file mode 100644
index 0000000000..395767ba7f
Binary files /dev/null and b/Brand/Custom.xcassets/introSlide3.imageset/Tablet Portrait - second slide.png differ
diff --git a/Brand/Custom.xcassets/introSlide3.imageset/introSlide3.png b/Brand/Custom.xcassets/introSlide3.imageset/introSlide3.png
new file mode 100644
index 0000000000..bd19e31a5b
Binary files /dev/null and b/Brand/Custom.xcassets/introSlide3.imageset/introSlide3.png differ
diff --git a/Brand/Custom.xcassets/introSlide3.imageset/introSlide3@2x.png b/Brand/Custom.xcassets/introSlide3.imageset/introSlide3@2x.png
new file mode 100644
index 0000000000..bd19e31a5b
Binary files /dev/null and b/Brand/Custom.xcassets/introSlide3.imageset/introSlide3@2x.png differ
diff --git a/Brand/Custom.xcassets/introSlide3.imageset/introSlide3@3x.png b/Brand/Custom.xcassets/introSlide3.imageset/introSlide3@3x.png
new file mode 100644
index 0000000000..223fee7741
Binary files /dev/null and b/Brand/Custom.xcassets/introSlide3.imageset/introSlide3@3x.png differ
diff --git a/Brand/Custom.xcassets/introSlideEight1.imageset/Contents.json b/Brand/Custom.xcassets/introSlideEight1.imageset/Contents.json
new file mode 100644
index 0000000000..56a179f397
--- /dev/null
+++ b/Brand/Custom.xcassets/introSlideEight1.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "introSlideEight1@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Brand/Custom.xcassets/introSlideEight1.imageset/introSlideEight1@3x.png b/Brand/Custom.xcassets/introSlideEight1.imageset/introSlideEight1@3x.png
new file mode 100644
index 0000000000..244802dfc2
Binary files /dev/null and b/Brand/Custom.xcassets/introSlideEight1.imageset/introSlideEight1@3x.png differ
diff --git a/Brand/Custom.xcassets/introSlideEight2.imageset/Contents.json b/Brand/Custom.xcassets/introSlideEight2.imageset/Contents.json
new file mode 100644
index 0000000000..4e7d271b20
--- /dev/null
+++ b/Brand/Custom.xcassets/introSlideEight2.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "introSlideEight2@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Brand/Custom.xcassets/introSlideEight2.imageset/introSlideEight2@3x.png b/Brand/Custom.xcassets/introSlideEight2.imageset/introSlideEight2@3x.png
new file mode 100644
index 0000000000..7cccb2c941
Binary files /dev/null and b/Brand/Custom.xcassets/introSlideEight2.imageset/introSlideEight2@3x.png differ
diff --git a/Brand/Custom.xcassets/introSlideEight3.imageset/Contents.json b/Brand/Custom.xcassets/introSlideEight3.imageset/Contents.json
new file mode 100644
index 0000000000..d1192931e8
--- /dev/null
+++ b/Brand/Custom.xcassets/introSlideEight3.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "introSlideEight3@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Brand/Custom.xcassets/introSlideEight3.imageset/introSlideEight3@3x.png b/Brand/Custom.xcassets/introSlideEight3.imageset/introSlideEight3@3x.png
new file mode 100644
index 0000000000..21adc87717
Binary files /dev/null and b/Brand/Custom.xcassets/introSlideEight3.imageset/introSlideEight3@3x.png differ
diff --git a/Brand/Custom.xcassets/introSlideLand1.imageset/Contents.json b/Brand/Custom.xcassets/introSlideLand1.imageset/Contents.json
new file mode 100644
index 0000000000..58788d977d
--- /dev/null
+++ b/Brand/Custom.xcassets/introSlideLand1.imageset/Contents.json
@@ -0,0 +1,33 @@
+{
+ "images" : [
+ {
+ "filename" : "introSlide1.png",
+ "idiom" : "iphone",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "introSlide1@2x.png",
+ "idiom" : "iphone",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "introSlide1@3x.png",
+ "idiom" : "iphone",
+ "scale" : "3x"
+ },
+ {
+ "filename" : "Tablet Landscape - first slide.png",
+ "idiom" : "ipad",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "Tablet Landscape - first slide-1.png",
+ "idiom" : "ipad",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Brand/Custom.xcassets/introSlideLand1.imageset/Tablet Landscape - first slide-1.png b/Brand/Custom.xcassets/introSlideLand1.imageset/Tablet Landscape - first slide-1.png
new file mode 100644
index 0000000000..6e3df04303
Binary files /dev/null and b/Brand/Custom.xcassets/introSlideLand1.imageset/Tablet Landscape - first slide-1.png differ
diff --git a/Brand/Custom.xcassets/introSlideLand1.imageset/Tablet Landscape - first slide.png b/Brand/Custom.xcassets/introSlideLand1.imageset/Tablet Landscape - first slide.png
new file mode 100644
index 0000000000..6e3df04303
Binary files /dev/null and b/Brand/Custom.xcassets/introSlideLand1.imageset/Tablet Landscape - first slide.png differ
diff --git a/Brand/Custom.xcassets/introSlideLand1.imageset/introSlide1.png b/Brand/Custom.xcassets/introSlideLand1.imageset/introSlide1.png
new file mode 100644
index 0000000000..7ad97b76bc
Binary files /dev/null and b/Brand/Custom.xcassets/introSlideLand1.imageset/introSlide1.png differ
diff --git a/Brand/Custom.xcassets/introSlideLand1.imageset/introSlide1@2x.png b/Brand/Custom.xcassets/introSlideLand1.imageset/introSlide1@2x.png
new file mode 100644
index 0000000000..7ad97b76bc
Binary files /dev/null and b/Brand/Custom.xcassets/introSlideLand1.imageset/introSlide1@2x.png differ
diff --git a/Brand/Custom.xcassets/introSlideLand1.imageset/introSlide1@3x.png b/Brand/Custom.xcassets/introSlideLand1.imageset/introSlide1@3x.png
new file mode 100644
index 0000000000..271ec26fda
Binary files /dev/null and b/Brand/Custom.xcassets/introSlideLand1.imageset/introSlide1@3x.png differ
diff --git a/Brand/Custom.xcassets/introSlideLand2.imageset/Contents.json b/Brand/Custom.xcassets/introSlideLand2.imageset/Contents.json
new file mode 100644
index 0000000000..efbfa73a66
--- /dev/null
+++ b/Brand/Custom.xcassets/introSlideLand2.imageset/Contents.json
@@ -0,0 +1,33 @@
+{
+ "images" : [
+ {
+ "filename" : "introSlide2.png",
+ "idiom" : "iphone",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "introSlide2@2x.png",
+ "idiom" : "iphone",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "introSlide2@3x.png",
+ "idiom" : "iphone",
+ "scale" : "3x"
+ },
+ {
+ "filename" : "Tablet Landscape - second slide.png",
+ "idiom" : "ipad",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "Tablet Landscape - second slide-1.png",
+ "idiom" : "ipad",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Brand/Custom.xcassets/introSlideLand2.imageset/Tablet Landscape - second slide-1.png b/Brand/Custom.xcassets/introSlideLand2.imageset/Tablet Landscape - second slide-1.png
new file mode 100644
index 0000000000..c5e3bca8af
Binary files /dev/null and b/Brand/Custom.xcassets/introSlideLand2.imageset/Tablet Landscape - second slide-1.png differ
diff --git a/Brand/Custom.xcassets/introSlideLand2.imageset/Tablet Landscape - second slide.png b/Brand/Custom.xcassets/introSlideLand2.imageset/Tablet Landscape - second slide.png
new file mode 100644
index 0000000000..c5e3bca8af
Binary files /dev/null and b/Brand/Custom.xcassets/introSlideLand2.imageset/Tablet Landscape - second slide.png differ
diff --git a/Brand/Custom.xcassets/introSlideLand2.imageset/introSlide2.png b/Brand/Custom.xcassets/introSlideLand2.imageset/introSlide2.png
new file mode 100644
index 0000000000..df3e9d9339
Binary files /dev/null and b/Brand/Custom.xcassets/introSlideLand2.imageset/introSlide2.png differ
diff --git a/Brand/Custom.xcassets/introSlideLand2.imageset/introSlide2@2x.png b/Brand/Custom.xcassets/introSlideLand2.imageset/introSlide2@2x.png
new file mode 100644
index 0000000000..df3e9d9339
Binary files /dev/null and b/Brand/Custom.xcassets/introSlideLand2.imageset/introSlide2@2x.png differ
diff --git a/Brand/Custom.xcassets/introSlideLand2.imageset/introSlide2@3x.png b/Brand/Custom.xcassets/introSlideLand2.imageset/introSlide2@3x.png
new file mode 100644
index 0000000000..17bf5d89a4
Binary files /dev/null and b/Brand/Custom.xcassets/introSlideLand2.imageset/introSlide2@3x.png differ
diff --git a/Brand/Custom.xcassets/introSlideLand3.imageset/Contents.json b/Brand/Custom.xcassets/introSlideLand3.imageset/Contents.json
new file mode 100644
index 0000000000..fce5b583fd
--- /dev/null
+++ b/Brand/Custom.xcassets/introSlideLand3.imageset/Contents.json
@@ -0,0 +1,33 @@
+{
+ "images" : [
+ {
+ "filename" : "introSlide3.png",
+ "idiom" : "iphone",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "introSlide3@2x.png",
+ "idiom" : "iphone",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "introSlide3@3x.png",
+ "idiom" : "iphone",
+ "scale" : "3x"
+ },
+ {
+ "filename" : "Tablet Landscape - third slide.png",
+ "idiom" : "ipad",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "Tablet Landscape - third slide-1.png",
+ "idiom" : "ipad",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Brand/Custom.xcassets/introSlideLand3.imageset/Tablet Landscape - third slide-1.png b/Brand/Custom.xcassets/introSlideLand3.imageset/Tablet Landscape - third slide-1.png
new file mode 100644
index 0000000000..faa2188a48
Binary files /dev/null and b/Brand/Custom.xcassets/introSlideLand3.imageset/Tablet Landscape - third slide-1.png differ
diff --git a/Brand/Custom.xcassets/introSlideLand3.imageset/Tablet Landscape - third slide.png b/Brand/Custom.xcassets/introSlideLand3.imageset/Tablet Landscape - third slide.png
new file mode 100644
index 0000000000..faa2188a48
Binary files /dev/null and b/Brand/Custom.xcassets/introSlideLand3.imageset/Tablet Landscape - third slide.png differ
diff --git a/Brand/Custom.xcassets/introSlideLand3.imageset/introSlide3.png b/Brand/Custom.xcassets/introSlideLand3.imageset/introSlide3.png
new file mode 100644
index 0000000000..bd19e31a5b
Binary files /dev/null and b/Brand/Custom.xcassets/introSlideLand3.imageset/introSlide3.png differ
diff --git a/Brand/Custom.xcassets/introSlideLand3.imageset/introSlide3@2x.png b/Brand/Custom.xcassets/introSlideLand3.imageset/introSlide3@2x.png
new file mode 100644
index 0000000000..bd19e31a5b
Binary files /dev/null and b/Brand/Custom.xcassets/introSlideLand3.imageset/introSlide3@2x.png differ
diff --git a/Brand/Custom.xcassets/introSlideLand3.imageset/introSlide3@3x.png b/Brand/Custom.xcassets/introSlideLand3.imageset/introSlide3@3x.png
new file mode 100644
index 0000000000..223fee7741
Binary files /dev/null and b/Brand/Custom.xcassets/introSlideLand3.imageset/introSlide3@3x.png differ
diff --git a/Brand/Intro/NCIntro.storyboard b/Brand/Intro/NCIntro.storyboard
index 5e14cab3fa..c17b6df339 100644
--- a/Brand/Intro/NCIntro.storyboard
+++ b/Brand/Intro/NCIntro.storyboard
@@ -1,111 +1,123 @@
-
+
-
+
+
-
+
-
-
+
+
-
-
+
+
-
-
-
-
+
-
-
+
+
-
-
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
-
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
-
+
+
+
+
+
+
diff --git a/Brand/Intro/NCIntroCollectionViewCell.xib b/Brand/Intro/NCIntroCollectionViewCell.xib
index 7eed66d3ba..ab7c53a1de 100644
--- a/Brand/Intro/NCIntroCollectionViewCell.xib
+++ b/Brand/Intro/NCIntroCollectionViewCell.xib
@@ -1,56 +1,57 @@
-
+
-
+
-
+
-
-
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
+
+
-
+
diff --git a/Brand/Intro/NCIntroViewController.swift b/Brand/Intro/NCIntroViewController.swift
index ae81a2ae7d..a55e1d2fb9 100644
--- a/Brand/Intro/NCIntroViewController.swift
+++ b/Brand/Intro/NCIntroViewController.swift
@@ -24,6 +24,7 @@
//
import UIKit
+import NextcloudKit
class NCIntroViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
@@ -32,19 +33,26 @@ class NCIntroViewController: UIViewController, UICollectionViewDataSource, UICol
@IBOutlet weak var buttonHost: UIButton!
@IBOutlet weak var introCollectionView: UICollectionView!
@IBOutlet weak var pageControl: UIPageControl!
+ @IBOutlet weak var contstraintBottomLoginButton: NSLayoutConstraint!
@objc weak var delegate: NCIntroViewController?
private let appDelegate = (UIApplication.shared.delegate as? AppDelegate)!
- private let titles = [NSLocalizedString("_intro_1_title_", comment: ""), NSLocalizedString("_intro_2_title_", comment: ""), NSLocalizedString("_intro_3_title_", comment: ""), NSLocalizedString("_intro_4_title_", comment: "")]
- private let images = [UIImage(named: "intro1"), UIImage(named: "intro2"), UIImage(named: "intro3"), UIImage(named: "intro4")]
+ private let titles = [NSLocalizedString("", comment: ""), NSLocalizedString("", comment: ""), NSLocalizedString("", comment: "")]
+ private var images:[UIImage?] = []
private var timerAutoScroll: Timer?
private var textColor: UIColor = .white
private var textColorOpponent: UIColor = .black
+ private let imagesLandscape = [UIImage(named: "introSlideLand1"), UIImage(named: "introSlideLand2"), UIImage(named: "introSlideLand3")]
+ private let imagesPortrait = [UIImage(named: "introSlide1"), UIImage(named: "introSlide2"), UIImage(named: "introSlide3")]
+ private let imagesEightPortrait = [UIImage(named: "introSlideEight1"), UIImage(named: "introSlideEight2"), UIImage(named: "introSlideEight3")]
// MARK: - View Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
+
+ let isEightPlusDevice = UIScreen.main.bounds.height == 736
+ images = UIDevice.current.orientation.isLandscape ? imagesLandscape : (isEightPlusDevice ? imagesEightPortrait : imagesPortrait)
let isTooLight = NCBrandColor.shared.customer.isTooLight()
let isTooDark = NCBrandColor.shared.customer.isTooDark()
@@ -71,7 +79,7 @@ class NCIntroViewController: UIViewController, UICollectionViewDataSource, UICol
pageControl.currentPageIndicatorTintColor = textColor
pageControl.pageIndicatorTintColor = .lightGray
- buttonLogin.layer.cornerRadius = 20
+ buttonLogin.layer.cornerRadius = 4
buttonLogin.setTitleColor(NCBrandColor.shared.customer, for: .normal)
buttonLogin.backgroundColor = textColor
buttonLogin.setTitle(NSLocalizedString("_log_in_", comment: ""), for: .normal)
@@ -97,6 +105,7 @@ class NCIntroViewController: UIViewController, UICollectionViewDataSource, UICol
view.backgroundColor = NCBrandColor.shared.customer
timerAutoScroll = Timer.scheduledTimer(timeInterval: 5, target: self, selector: (#selector(NCIntroViewController.autoScroll)), userInfo: nil, repeats: true)
+ NotificationCenter.default.addObserver(self, selector: #selector(resetPageController(_:)), name: UIApplication.willEnterForegroundNotification, object: nil)
}
override var preferredStatusBarStyle: UIStatusBarStyle {
@@ -107,14 +116,38 @@ class NCIntroViewController: UIViewController, UICollectionViewDataSource, UICol
}
}
+ override func viewWillAppear(_ animated: Bool) {
+ super.viewWillAppear(animated)
+ if (UIDevice.current.userInterfaceIdiom != .pad){
+ AppUtility.lockOrientation(UIInterfaceOrientationMask.portrait, andRotateTo: UIInterfaceOrientation.portrait)
+ }
+ navigationController?.setNavigationBarHidden(true, animated: animated)
+ }
+
+ override func viewDidLayoutSubviews() {
+ if UIScreen.main.bounds.width < 350 || UIScreen.main.bounds.height > 800 {
+ contstraintBottomLoginButton.constant = 15
+ }
+ }
+
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
timerAutoScroll?.invalidate()
+ AppUtility.lockOrientation(UIInterfaceOrientationMask.all)
+ navigationController?.setNavigationBarHidden(false, animated: animated)
}
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
+ let isEightPlusDevice = UIScreen.main.bounds.height == 736
+ images = UIDevice.current.orientation.isLandscape ? imagesLandscape : (isEightPlusDevice ? imagesEightPortrait : imagesPortrait)
pageControl.currentPage = 0
introCollectionView.collectionViewLayout.invalidateLayout()
+ self.introCollectionView.reloadData()
+ }
+
+ @objc func resetPageController(_ notification: NSNotification){
+ pageControl.currentPage = 0
+ introCollectionView.scrollToItem(at: IndexPath(row: pageControl.currentPage, section: 0), at: .centeredHorizontally, animated: true)
}
@objc func autoScroll() {
@@ -141,6 +174,7 @@ class NCIntroViewController: UIViewController, UICollectionViewDataSource, UICol
cell.titleLabel.textColor = textColor
cell.titleLabel.text = titles[indexPath.row]
cell.imageView.image = images[indexPath.row]
+ cell.imageView.contentMode = .scaleAspectFill
return cell
}
@@ -150,7 +184,13 @@ class NCIntroViewController: UIViewController, UICollectionViewDataSource, UICol
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
timerAutoScroll = Timer.scheduledTimer(timeInterval: 5, target: self, selector: (#selector(NCIntroViewController.autoScroll)), userInfo: nil, repeats: true)
- pageControl.currentPage = Int(scrollView.contentOffset.x) / Int(scrollView.frame.width)
+ let page = Int(scrollView.contentOffset.x) / Int(scrollView.frame.width)
+ if pageControl.currentPage == (images.count - 1), pageControl.currentPage <= page {
+ pageControl.currentPage = 0
+ introCollectionView.scrollToItem(at: IndexPath(row: pageControl.currentPage, section: 0), at: .centeredHorizontally, animated: false)
+ } else {
+ pageControl.currentPage = Int(scrollView.contentOffset.x) / Int(scrollView.frame.width)
+ }
}
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
@@ -158,7 +198,22 @@ class NCIntroViewController: UIViewController, UICollectionViewDataSource, UICol
}
@IBAction func login(_ sender: Any) {
- appDelegate.openLogin(viewController: navigationController, selector: NCGlobal.shared.introLogin, openLoginWeb: false)
+ if NCBrandOptions.shared.use_AppConfig == true {
+ let loginViewPage = UIStoryboard(name: "NCLogin", bundle: Bundle.main).instantiateViewController(identifier: "NCLogin")
+ navigationController?.pushViewController(loginViewPage, animated: true)
+ } else {
+ if NextcloudKit.shared.isNetworkReachable() {
+ appDelegate.openLogin(viewController: navigationController, selector: NCGlobal.shared.introLogin, openLoginWeb: false)
+ } else {
+ showNoInternetAlert()
+ }
+ }
+ }
+
+ func showNoInternetAlert(){
+ let alertController = UIAlertController(title: NSLocalizedString("_no_internet_alert_title_", comment: ""), message: NSLocalizedString("_no_internet_alert_message_", comment: ""), preferredStyle: .alert)
+ alertController.addAction(UIAlertAction(title: NSLocalizedString("_ok_", comment: ""), style: .default, handler: { action in }))
+ self.present(alertController, animated: true)
}
@IBAction func signup(_ sender: Any) {
diff --git a/Brand/LaunchScreen.storyboard b/Brand/LaunchScreen.storyboard
index 26840f6195..5038467a6f 100755
--- a/Brand/LaunchScreen.storyboard
+++ b/Brand/LaunchScreen.storyboard
@@ -1,38 +1,59 @@
-
+
-
+
-
+
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
-
-
+
+
+
+
-
+
-
+
diff --git a/Tests/NextcloudUnitTests/OnboardingTestCase.swift b/Tests/NextcloudUnitTests/OnboardingTestCase.swift
new file mode 100644
index 0000000000..161b3a9258
--- /dev/null
+++ b/Tests/NextcloudUnitTests/OnboardingTestCase.swift
@@ -0,0 +1,158 @@
+//
+// OnboardingTestCase.swift
+// NextcloudTests
+//
+// Created by A200073704 on 21/04/23.
+// Copyright © 2023 Marino Faggiana. All rights reserved.
+//
+
+@testable import Nextcloud
+import XCTest
+import NextcloudKit
+
+ class OnboardingTestCase: XCTestCase {
+
+ var viewController = NCIntroViewController()
+
+
+ var images:[UIImage?] = []
+ let imagesLandscape = [UIImage(named: "introSlideLand1"), UIImage(named: "introSlideLand2"), UIImage(named: "introSlideLand3")]
+ let imagesPortrait = [UIImage(named: "introSlide1"), UIImage(named: "introSlide2"), UIImage(named: "introSlide3")]
+ let imagesEightPortrait = [UIImage(named: "introSlideEight1"), UIImage(named: "introSlideEight2"), UIImage(named: "introSlideEight3")]
+
+
+
+ override func setUpWithError() throws {
+ // Put setup code here. This method is called before the invocation of each test method in the class.
+ }
+
+
+ override func tearDownWithError() throws {
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
+ }
+
+
+ func testValidImage() {
+
+ // onscreen images should not be nill
+ let image = [UIImage(named: "introSlideLand1"), UIImage(named: "introSlideLand2"), UIImage(named: "introSlideLand3")]
+ XCTAssertNotNil(image, "Image should not be nil")
+
+ }
+
+ func testImageDimensionsLandscape() {
+
+ // testing height and width of the image
+ let introCollectionView = UIImage(named: "introSlideLand1")
+ XCTAssertEqual(introCollectionView?.size.width, 390, "Image width should be 390")
+ XCTAssertEqual(introCollectionView?.size.height, 844.3333333333334, "Image height should be 844.3333333333334")
+ }
+
+ func testImageDimensionsPortrait() {
+
+ // testing height and width of the image
+ let introCollectionView = UIImage(named: "introSlide1")
+
+ XCTAssertEqual(introCollectionView?.size.width, 390, "Image width should be 390")
+ XCTAssertEqual(introCollectionView?.size.height, 844.3333333333334, "Image height should be 844.3333333333334")
+ }
+
+
+ func testImageDimentionsNotEqual() {
+
+ // testing width and height if not equal
+ let introCollectionView = UIImage(named: "introSlide2")
+
+ XCTAssertNotEqual(introCollectionView?.size.width, 100, "Image width should be 390")
+ XCTAssertNotEqual(introCollectionView?.size.height, 820, "Image height should be 844.3333333333334")
+
+ }
+
+
+ func testImageContentMode() {
+
+ // imageview content mode should be scaleAspectFill
+ let imageView = UIImageView()
+ imageView.contentMode = .scaleAspectFill
+ imageView.image = UIImage(named: "introSlideLand2")
+ XCTAssertEqual(imageView.contentMode, .scaleAspectFill, "Image content mode should be scaleAspectFill")
+
+ }
+
+
+ // Background color of view should be customer
+ func testBackgroundcolor() {
+
+ let backgroundColor = NCBrandColor.shared.customer
+ XCTAssertNotNil(backgroundColor, "NCBrandColor.shared.customer should not be nil")
+
+ }
+
+
+ // Button login text color shouyld be white
+ func testButtonLoginTextColor() {
+
+ let textColor: UIColor = .white
+ viewController.buttonLogin?.backgroundColor = textColor
+
+ XCTAssertEqual(textColor, textColor)
+
+ }
+
+ // images at loginscreen should not be empty
+ func testImagesNotEmpty() {
+
+ let isEightPlusDevice = UIScreen.main.bounds.height == 736
+ images = UIDevice.current.orientation.isLandscape ? imagesLandscape : (isEightPlusDevice ? imagesEightPortrait : imagesPortrait)
+
+ XCTAssertFalse(images.isEmpty)
+ }
+
+
+ // Status bar and navigation bar color should not be blue color
+ func testStatueBarColorNotEqualToCustomer() {
+
+
+ let view = NCLoginWeb()
+ var color = view.navigationController?.navigationBar.backgroundColor
+ let navigationBarColor: UIColor = NCBrandColor.shared.customer
+ color = .systemBlue
+
+ XCTAssertNotEqual(navigationBarColor, color)
+
+ }
+
+ //NavigationBar and status Bar color should be equal
+ func testNavigationBarColorEqualToCustomer() {
+
+ let statusBarColor = NCBrandColor.shared.customer
+ let navigationBarColor: UIColor = NCBrandColor.shared.customer
+
+ XCTAssertEqual(navigationBarColor, statusBarColor)
+ }
+
+ func testEightPlusDeviceHeight() {
+
+ let eightPlusDevice = UIScreen.main.bounds.height >= 736
+
+ XCTAssertTrue(eightPlusDevice)
+
+ }
+
+ func testLoginButtonTapped() {
+
+ let viewController = NCIntroViewController()
+
+ let loginButton = UIButton()
+ loginButton.addTarget(nil, action: #selector(viewController.login(_:)), for: .touchUpInside)
+ loginButton.sendActions(for: .touchUpInside)
+
+ viewController.login(loginButton)
+
+ XCTAssertNotNil(loginButton)
+ }
+
+
+
+
+}
diff --git a/iOSClient/AppDelegate.swift b/iOSClient/AppDelegate.swift
index 73b413483b..5fc96cecc0 100644
--- a/iOSClient/AppDelegate.swift
+++ b/iOSClient/AppDelegate.swift
@@ -56,6 +56,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
private var privacyProtectionWindow: UIWindow?
var isAppRefresh: Bool = false
var isAppProcessing: Bool = false
+
+ var orientationLock = UIInterfaceOrientationMask.all
var isUiTestingEnabled: Bool {
return ProcessInfo.processInfo.arguments.contains("UI_TESTING")
@@ -1142,3 +1144,10 @@ extension AppDelegate: NCCreateFormUploadConflictDelegate {
NCNetworkingProcessUpload.shared.createProcessUploads(metadatas: metadatas) { _ in }
}
}
+
+//MARK: NMC Customisation
+extension AppDelegate {
+ func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
+ return self.orientationLock
+ }
+}
diff --git a/iOSClient/AppUtility.swift b/iOSClient/AppUtility.swift
new file mode 100644
index 0000000000..bb7c625e53
--- /dev/null
+++ b/iOSClient/AppUtility.swift
@@ -0,0 +1,21 @@
+//
+// AppUtility.swift
+// Nextcloud
+//
+// Created by Amrut Waghmare on 17/10/23.
+// Copyright © 2023 Marino Faggiana. All rights reserved.
+//
+
+import Foundation
+struct AppUtility {
+ static func lockOrientation(_ orientation: UIInterfaceOrientationMask) {
+ if let delegate = UIApplication.shared.delegate as? AppDelegate {
+ delegate.orientationLock = orientation
+ }
+ }
+
+ static func lockOrientation(_ orientation: UIInterfaceOrientationMask, andRotateTo rotateOrientation:UIInterfaceOrientation) {
+ self.lockOrientation(orientation)
+ UIDevice.current.setValue(rotateOrientation.rawValue, forKey: "orientation")
+ }
+}