Add ability to change app icon
@ -1259,6 +1259,7 @@
|
||||
B6B226971BE4B7D200860F4D /* ContactsUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B6B226961BE4B7D200860F4D /* ContactsUI.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
|
||||
B6F509971AA53F760068F56A /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = B6F509951AA53F760068F56A /* Localizable.strings */; };
|
||||
B6FE7EB71ADD62FA00A6D22F /* PushKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B6FE7EB61ADD62FA00A6D22F /* PushKit.framework */; };
|
||||
B909C1592AAA5BAA00FED2AF /* AppIconSettingsTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B909C1582AAA5BAA00FED2AF /* AppIconSettingsTableViewController.swift */; };
|
||||
B91ACD9E2A797698000CFBC7 /* StickerPickerKeyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = B91ACD9D2A797698000CFBC7 /* StickerPickerKeyboard.swift */; };
|
||||
B9439F3DDBE241269273DD6F /* Pods_SignalServiceKitTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DBCD4214999408EBC915EE0F /* Pods_SignalServiceKitTests.framework */; };
|
||||
B99B155D2A71BA5200E26DAC /* StoryContextViewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = B99B155C2A71BA5200E26DAC /* StoryContextViewState.swift */; };
|
||||
@ -3880,6 +3881,7 @@
|
||||
B6BC3D0C1AA544B100C2907F /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = translations/da.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B6F509961AA53F760068F56A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = translations/en.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B6FE7EB61ADD62FA00A6D22F /* PushKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PushKit.framework; path = System/Library/Frameworks/PushKit.framework; sourceTree = SDKROOT; };
|
||||
B909C1582AAA5BAA00FED2AF /* AppIconSettingsTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppIconSettingsTableViewController.swift; sourceTree = "<group>"; };
|
||||
B91ACD9D2A797698000CFBC7 /* StickerPickerKeyboard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StickerPickerKeyboard.swift; sourceTree = "<group>"; };
|
||||
B99B155C2A71BA5200E26DAC /* StoryContextViewState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoryContextViewState.swift; sourceTree = "<group>"; };
|
||||
B9A87A352A9D1D25009FCA13 /* EditorSticker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorSticker.swift; sourceTree = "<group>"; };
|
||||
@ -7387,6 +7389,7 @@
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
8827004D23208A1900F01C46 /* AppearanceSettingsTableViewController.swift */,
|
||||
B909C1582AAA5BAA00FED2AF /* AppIconSettingsTableViewController.swift */,
|
||||
8829883825B979F900DEE1E3 /* ThemeSettingsTableViewController.swift */,
|
||||
);
|
||||
path = Appearance;
|
||||
@ -11470,6 +11473,7 @@
|
||||
8827004E23208A1900F01C46 /* AppearanceSettingsTableViewController.swift in Sources */,
|
||||
34D99CE4217509C2000AFB39 /* AppEnvironment.swift in Sources */,
|
||||
50EF8DCA2A1885C000A00935 /* AppIconBadgeUpdater.swift in Sources */,
|
||||
B909C1592AAA5BAA00FED2AF /* AppIconSettingsTableViewController.swift in Sources */,
|
||||
F941B17028412D5F00498CCD /* ApplePayButton.swift in Sources */,
|
||||
88F58A1725EEE5B9008CDA24 /* AppSettingsViewController.swift in Sources */,
|
||||
F9BC0A2527FB8E730085B23D /* AppSettingsViewsUtil.swift in Sources */,
|
||||
@ -14500,6 +14504,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 7BB1CB6F2D7841356BE367EA /* Pods-Signal.testable release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES = "AppIcon-color AppIcon-bubbles AppIcon-white AppIcon-dark AppIcon-dark-variant AppIcon-chat AppIcon-yellow AppIcon-news AppIcon-notes AppIcon-weather AppIcon-wave";
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ADDRESS_SANITIZER_CONTAINER_OVERFLOW = NO;
|
||||
CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES;
|
||||
@ -15029,6 +15034,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = AEA97ACC8D9F89DB5E045B2B /* Pods-Signal.profiling.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES = "AppIcon-color AppIcon-bubbles AppIcon-white AppIcon-dark AppIcon-dark-variant AppIcon-chat AppIcon-yellow AppIcon-news AppIcon-notes AppIcon-weather AppIcon-wave";
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ADDRESS_SANITIZER_CONTAINER_OVERFLOW = NO;
|
||||
CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES;
|
||||
@ -15516,6 +15522,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = DE2DD605305BC6EFAD731723 /* Pods-Signal.debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES = "AppIcon-color AppIcon-bubbles AppIcon-white AppIcon-dark AppIcon-dark-variant AppIcon-chat AppIcon-yellow AppIcon-news AppIcon-notes AppIcon-weather AppIcon-wave";
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ADDRESS_SANITIZER_CONTAINER_OVERFLOW = YES;
|
||||
CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES;
|
||||
@ -15567,6 +15574,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = DF728B4B438716EAF95CEC18 /* Pods-Signal.app store release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES = "AppIcon-color AppIcon-bubbles AppIcon-white AppIcon-dark AppIcon-dark-variant AppIcon-chat AppIcon-yellow AppIcon-news AppIcon-notes AppIcon-weather AppIcon-wave";
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ADDRESS_SANITIZER_CONTAINER_OVERFLOW = NO;
|
||||
CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES;
|
||||
|
||||
|
After Width: | Height: | Size: 48 KiB |
@ -0,0 +1,14 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "Bubbles_1024x1024.png",
|
||||
"idiom" : "universal",
|
||||
"platform" : "ios",
|
||||
"size" : "1024x1024"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 83 KiB |
14
Signal/Images.xcassets/AppIcon-chat.appiconset/Contents.json
Normal file
@ -0,0 +1,14 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "Chat_1024x1024.png",
|
||||
"idiom" : "universal",
|
||||
"platform" : "ios",
|
||||
"size" : "1024x1024"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,14 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "SignalColor_1024x1024.png",
|
||||
"idiom" : "universal",
|
||||
"platform" : "ios",
|
||||
"size" : "1024x1024"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 94 KiB |
@ -0,0 +1,14 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "SignalDarkVariant_1024x1024.png",
|
||||
"idiom" : "universal",
|
||||
"platform" : "ios",
|
||||
"size" : "1024x1024"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 84 KiB |
14
Signal/Images.xcassets/AppIcon-dark.appiconset/Contents.json
Normal file
@ -0,0 +1,14 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "SignalDark_1024x1024.png",
|
||||
"idiom" : "universal",
|
||||
"platform" : "ios",
|
||||
"size" : "1024x1024"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 108 KiB |
14
Signal/Images.xcassets/AppIcon-news.appiconset/Contents.json
Normal file
@ -0,0 +1,14 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "News_1024x1024.png",
|
||||
"idiom" : "universal",
|
||||
"platform" : "ios",
|
||||
"size" : "1024x1024"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 24 KiB |
@ -0,0 +1,14 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "Notes_1024x1024.png",
|
||||
"idiom" : "universal",
|
||||
"platform" : "ios",
|
||||
"size" : "1024x1024"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 42 KiB |
14
Signal/Images.xcassets/AppIcon-wave.appiconset/Contents.json
Normal file
@ -0,0 +1,14 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "Waves_1024x1024.png",
|
||||
"idiom" : "universal",
|
||||
"platform" : "ios",
|
||||
"size" : "1024x1024"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 105 KiB |
@ -0,0 +1,14 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "Weather_1024x1024.png",
|
||||
"idiom" : "universal",
|
||||
"platform" : "ios",
|
||||
"size" : "1024x1024"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 114 KiB |
@ -0,0 +1,14 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "SignalWhite_1024x1024.png",
|
||||
"idiom" : "universal",
|
||||
"platform" : "ios",
|
||||
"size" : "1024x1024"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 50 KiB |
@ -0,0 +1,14 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "Yellow_1024x1024.png",
|
||||
"idiom" : "universal",
|
||||
"platform" : "ios",
|
||||
"size" : "1024x1024"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 92 KiB |
22
Signal/Images.xcassets/AppIcon_preview.imageset/Contents.json
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "iphone-60@2x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "iphone-60@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
BIN
Signal/Images.xcassets/AppIcon_preview.imageset/iphone-60@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
BIN
Signal/Images.xcassets/AppIcon_preview.imageset/iphone-60@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
15
Signal/Images.xcassets/dock_ios.imageset/Contents.json
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "dock_ios.pdf",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
||||
316
Signal/Images.xcassets/dock_ios.imageset/dock_ios.pdf
vendored
Normal file
@ -0,0 +1,316 @@
|
||||
%PDF-1.7
|
||||
|
||||
1 0 obj
|
||||
<< /Length 2 0 R
|
||||
/Range [ 0.000000 1.000000 0.000000 1.000000 0.000000 1.000000 ]
|
||||
/Domain [ 0.000000 1.000000 ]
|
||||
/FunctionType 4
|
||||
>>
|
||||
stream
|
||||
{ 0.038646 exch 0.662500 exch 0.550206 exch dup 0.000000 gt { exch pop exch pop exch pop dup 0.000000 sub 0.961354 mul 0.038646 add exch dup 0.000000 sub 0.114167 mul 0.662500 add exch dup 0.000000 sub -0.108540 mul 0.550206 add exch } if dup 1.000000 gt { exch pop exch pop exch pop 1.000000 exch 0.776667 exch 0.441667 exch } if pop }
|
||||
endstream
|
||||
endobj
|
||||
|
||||
2 0 obj
|
||||
337
|
||||
endobj
|
||||
|
||||
3 0 obj
|
||||
<< /Type /XObject
|
||||
/Length 4 0 R
|
||||
/Group << /Type /Group
|
||||
/S /Transparency
|
||||
>>
|
||||
/Subtype /Form
|
||||
/Resources << /ExtGState << /E2 << /ca 0.700000 >>
|
||||
/E3 << /ca 0.600000 >>
|
||||
/E1 << /ca 0.200000 >>
|
||||
>>
|
||||
/Pattern << /P1 << /Matrix [ 0.000000 -244.000000 244.000000 0.000000 -240.000000 246.000000 ]
|
||||
/Shading << /Coords [ 0.000000 0.000000 1.000000 0.000000 ]
|
||||
/ColorSpace /DeviceRGB
|
||||
/Function 1 0 R
|
||||
/Domain [ 0.000000 1.000000 ]
|
||||
/ShadingType 2
|
||||
/Extend [ true true ]
|
||||
>>
|
||||
/PatternType 2
|
||||
/Type /Pattern
|
||||
>> >>
|
||||
>>
|
||||
/BBox [ 0.000000 0.000000 152.000000 120.000000 ]
|
||||
>>
|
||||
stream
|
||||
/DeviceRGB CS
|
||||
/DeviceRGB cs
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 4.000000 6.000000 cm
|
||||
/Pattern cs
|
||||
/P1 scn
|
||||
2.000000 218.000000 m
|
||||
2.000000 229.045700 10.954306 238.000000 22.000000 238.000000 c
|
||||
122.000000 238.000000 l
|
||||
133.045700 238.000000 142.000000 229.045700 142.000000 218.000000 c
|
||||
142.000000 18.000000 l
|
||||
142.000000 6.954300 133.045700 -2.000000 122.000000 -2.000000 c
|
||||
21.999998 -2.000000 l
|
||||
10.954304 -2.000000 2.000000 6.954300 2.000000 18.000000 c
|
||||
2.000000 218.000000 l
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
q
|
||||
/E1 gs
|
||||
1.000000 0.000000 -0.000000 1.000000 4.000000 6.000000 cm
|
||||
1.000000 1.000000 1.000000 scn
|
||||
2.000000 218.000000 m
|
||||
2.000000 229.045700 10.954306 238.000000 22.000000 238.000000 c
|
||||
122.000000 238.000000 l
|
||||
133.045700 238.000000 142.000000 229.045700 142.000000 218.000000 c
|
||||
142.000000 18.000000 l
|
||||
142.000000 6.954300 133.045700 -2.000000 122.000000 -2.000000 c
|
||||
21.999998 -2.000000 l
|
||||
10.954304 -2.000000 2.000000 6.954300 2.000000 18.000000 c
|
||||
2.000000 218.000000 l
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 4.000000 2.000000 cm
|
||||
0.397431 0.424355 0.491667 scn
|
||||
0.000000 222.000000 m
|
||||
0.000000 234.150269 9.849737 244.000000 22.000000 244.000000 c
|
||||
122.000000 244.000000 l
|
||||
134.150269 244.000000 144.000000 234.150269 144.000000 222.000000 c
|
||||
144.000000 22.000000 l
|
||||
144.000000 9.849731 134.150269 0.000000 122.000000 0.000000 c
|
||||
21.999998 0.000000 l
|
||||
9.849734 0.000000 0.000000 9.849731 0.000000 22.000000 c
|
||||
0.000000 222.000000 l
|
||||
h
|
||||
22.000000 240.000000 m
|
||||
12.058875 240.000000 4.000000 231.941132 4.000000 222.000000 c
|
||||
4.000000 22.000000 l
|
||||
4.000000 12.058868 12.058874 4.000000 21.999998 4.000000 c
|
||||
122.000000 4.000000 l
|
||||
131.941132 4.000000 140.000000 12.058868 140.000000 22.000000 c
|
||||
140.000000 222.000000 l
|
||||
140.000000 231.941132 131.941132 240.000000 122.000000 240.000000 c
|
||||
22.000000 240.000000 l
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
q
|
||||
/E2 gs
|
||||
1.000000 0.000000 -0.000000 1.000000 4.000000 208.000000 cm
|
||||
1.000000 1.000000 1.000000 scn
|
||||
8.000000 -174.000000 m
|
||||
8.000000 -165.715729 14.715729 -159.000000 23.000000 -159.000000 c
|
||||
121.000000 -159.000000 l
|
||||
129.284271 -159.000000 136.000000 -165.715729 136.000000 -174.000000 c
|
||||
136.000000 -182.000000 l
|
||||
136.000000 -190.284271 129.284271 -197.000000 121.000000 -197.000000 c
|
||||
23.000000 -197.000000 l
|
||||
14.715729 -197.000000 8.000000 -190.284271 8.000000 -182.000000 c
|
||||
8.000000 -174.000000 l
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 4.000000 224.000000 cm
|
||||
0.368627 0.772549 0.309804 scn
|
||||
16.000000 -189.000000 m
|
||||
16.000000 -185.686295 18.686291 -183.000000 22.000000 -183.000000 c
|
||||
32.000000 -183.000000 l
|
||||
35.313709 -183.000000 38.000000 -185.686295 38.000000 -189.000000 c
|
||||
38.000000 -199.000000 l
|
||||
38.000000 -202.313705 35.313709 -205.000000 32.000000 -205.000000 c
|
||||
22.000000 -205.000000 l
|
||||
18.686291 -205.000000 16.000000 -202.313705 16.000000 -199.000000 c
|
||||
16.000000 -189.000000 l
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 4.000000 224.000000 cm
|
||||
0.219608 0.670588 0.921569 scn
|
||||
46.000000 -189.000000 m
|
||||
46.000000 -185.686295 48.686291 -183.000000 52.000000 -183.000000 c
|
||||
62.000000 -183.000000 l
|
||||
65.313705 -183.000000 68.000000 -185.686295 68.000000 -189.000000 c
|
||||
68.000000 -199.000000 l
|
||||
68.000000 -202.313705 65.313705 -205.000000 62.000000 -205.000000 c
|
||||
52.000000 -205.000000 l
|
||||
48.686291 -205.000000 46.000000 -202.313705 46.000000 -199.000000 c
|
||||
46.000000 -189.000000 l
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 4.000000 224.000000 cm
|
||||
0.286146 0.837500 0.774975 scn
|
||||
76.000000 -189.000000 m
|
||||
76.000000 -185.686295 78.686295 -183.000000 82.000000 -183.000000 c
|
||||
92.000000 -183.000000 l
|
||||
95.313705 -183.000000 98.000000 -185.686295 98.000000 -189.000000 c
|
||||
98.000000 -199.000000 l
|
||||
98.000000 -202.313705 95.313705 -205.000000 92.000000 -205.000000 c
|
||||
82.000000 -205.000000 l
|
||||
78.686295 -205.000000 76.000000 -202.313705 76.000000 -199.000000 c
|
||||
76.000000 -189.000000 l
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 4.000000 224.000000 cm
|
||||
0.945833 0.310713 0.271927 scn
|
||||
106.000000 -189.000000 m
|
||||
106.000000 -185.686295 108.686295 -183.000000 112.000000 -183.000000 c
|
||||
122.000000 -183.000000 l
|
||||
125.313705 -183.000000 128.000000 -185.686295 128.000000 -189.000000 c
|
||||
128.000000 -199.000000 l
|
||||
128.000000 -202.313705 125.313705 -205.000000 122.000000 -205.000000 c
|
||||
112.000000 -205.000000 l
|
||||
108.686295 -205.000000 106.000000 -202.313705 106.000000 -199.000000 c
|
||||
106.000000 -189.000000 l
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
q
|
||||
/E3 gs
|
||||
1.000000 0.000000 -0.000000 1.000000 4.000000 238.000000 cm
|
||||
1.000000 1.000000 1.000000 scn
|
||||
60.000000 -175.000000 m
|
||||
60.000000 -172.790863 61.790863 -171.000000 64.000000 -171.000000 c
|
||||
81.000000 -171.000000 l
|
||||
83.209137 -171.000000 85.000000 -172.790863 85.000000 -175.000000 c
|
||||
85.000000 -177.209137 83.209137 -179.000000 81.000000 -179.000000 c
|
||||
64.000000 -179.000000 l
|
||||
61.790863 -179.000000 60.000000 -177.209137 60.000000 -175.000000 c
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
4 0 obj
|
||||
4741
|
||||
endobj
|
||||
|
||||
5 0 obj
|
||||
<< /Type /XObject
|
||||
/Length 6 0 R
|
||||
/Group << /Type /Group
|
||||
/S /Transparency
|
||||
>>
|
||||
/Subtype /Form
|
||||
/Resources << >>
|
||||
/BBox [ 0.000000 0.000000 152.000000 120.000000 ]
|
||||
>>
|
||||
stream
|
||||
/DeviceRGB CS
|
||||
/DeviceRGB cs
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
|
||||
0.000000 0.000000 0.000000 scn
|
||||
0.000000 120.000000 m
|
||||
152.000000 120.000000 l
|
||||
152.000000 0.000000 l
|
||||
0.000000 0.000000 l
|
||||
0.000000 120.000000 l
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
6 0 obj
|
||||
237
|
||||
endobj
|
||||
|
||||
7 0 obj
|
||||
<< /XObject << /X1 3 0 R >>
|
||||
/ExtGState << /E1 << /SMask << /Type /Mask
|
||||
/G 5 0 R
|
||||
/S /Alpha
|
||||
>>
|
||||
/Type /ExtGState
|
||||
>> >>
|
||||
>>
|
||||
endobj
|
||||
|
||||
8 0 obj
|
||||
<< /Length 9 0 R >>
|
||||
stream
|
||||
/DeviceRGB CS
|
||||
/DeviceRGB cs
|
||||
q
|
||||
/E1 gs
|
||||
/X1 Do
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
9 0 obj
|
||||
46
|
||||
endobj
|
||||
|
||||
10 0 obj
|
||||
<< /Annots []
|
||||
/Type /Page
|
||||
/MediaBox [ 0.000000 0.000000 152.000000 120.000000 ]
|
||||
/Resources 7 0 R
|
||||
/Contents 8 0 R
|
||||
/Parent 11 0 R
|
||||
>>
|
||||
endobj
|
||||
|
||||
11 0 obj
|
||||
<< /Kids [ 10 0 R ]
|
||||
/Count 1
|
||||
/Type /Pages
|
||||
>>
|
||||
endobj
|
||||
|
||||
12 0 obj
|
||||
<< /Pages 11 0 R
|
||||
/Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
|
||||
xref
|
||||
0 13
|
||||
0000000000 65535 f
|
||||
0000000010 00000 n
|
||||
0000000531 00000 n
|
||||
0000000553 00000 n
|
||||
0000006507 00000 n
|
||||
0000006530 00000 n
|
||||
0000007017 00000 n
|
||||
0000007039 00000 n
|
||||
0000007337 00000 n
|
||||
0000007439 00000 n
|
||||
0000007460 00000 n
|
||||
0000007637 00000 n
|
||||
0000007713 00000 n
|
||||
trailer
|
||||
<< /ID [ (some) (id) ]
|
||||
/Root 12 0 R
|
||||
/Size 13
|
||||
>>
|
||||
startxref
|
||||
7774
|
||||
%%EOF
|
||||
15
Signal/Images.xcassets/dock_ipados.imageset/Contents.json
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "dock_ipados.pdf",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
||||
348
Signal/Images.xcassets/dock_ipados.imageset/dock_ipados.pdf
vendored
Normal file
@ -0,0 +1,348 @@
|
||||
%PDF-1.7
|
||||
|
||||
1 0 obj
|
||||
<< /Length 2 0 R
|
||||
/Range [ 0.000000 1.000000 0.000000 1.000000 0.000000 1.000000 ]
|
||||
/Domain [ 0.000000 1.000000 ]
|
||||
/FunctionType 4
|
||||
>>
|
||||
stream
|
||||
{ 0.038646 exch 0.662500 exch 0.550206 exch dup 0.000000 gt { exch pop exch pop exch pop dup 0.000000 sub 0.961354 mul 0.038646 add exch dup 0.000000 sub 0.114167 mul 0.662500 add exch dup 0.000000 sub -0.108540 mul 0.550206 add exch } if dup 1.000000 gt { exch pop exch pop exch pop 1.000000 exch 0.776667 exch 0.441667 exch } if pop }
|
||||
endstream
|
||||
endobj
|
||||
|
||||
2 0 obj
|
||||
337
|
||||
endobj
|
||||
|
||||
3 0 obj
|
||||
<< /Type /XObject
|
||||
/Length 4 0 R
|
||||
/Group << /Type /Group
|
||||
/S /Transparency
|
||||
>>
|
||||
/Subtype /Form
|
||||
/Resources << /ExtGState << /E2 << /ca 0.600000 >>
|
||||
/E1 << /ca 0.200000 >>
|
||||
>>
|
||||
/Pattern << /P1 << /Matrix [ 0.000000 -181.000000 181.000000 0.000000 -181.000000 181.000000 ]
|
||||
/Shading << /Coords [ 0.000000 0.000000 1.000000 0.000000 ]
|
||||
/ColorSpace /DeviceRGB
|
||||
/Function 1 0 R
|
||||
/Domain [ 0.000000 1.000000 ]
|
||||
/ShadingType 2
|
||||
/Extend [ true true ]
|
||||
>>
|
||||
/PatternType 2
|
||||
/Type /Pattern
|
||||
>> >>
|
||||
>>
|
||||
/BBox [ 0.000000 0.000000 230.000000 130.000000 ]
|
||||
>>
|
||||
stream
|
||||
/DeviceRGB CS
|
||||
/DeviceRGB cs
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 0.000000 6.000000 cm
|
||||
/Pattern cs
|
||||
/P1 scn
|
||||
3.000000 148.000000 m
|
||||
3.000000 161.254837 13.745167 172.000000 27.000000 172.000000 c
|
||||
203.000000 172.000000 l
|
||||
216.254837 172.000000 227.000000 161.254837 227.000000 148.000000 c
|
||||
227.000000 21.000000 l
|
||||
227.000000 7.745163 216.254837 -3.000000 203.000000 -3.000000 c
|
||||
27.000002 -3.000000 l
|
||||
13.745169 -3.000000 3.000000 7.745163 3.000000 21.000000 c
|
||||
3.000000 148.000000 l
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
q
|
||||
/E1 gs
|
||||
1.000000 0.000000 -0.000000 1.000000 0.000000 6.000000 cm
|
||||
1.000000 1.000000 1.000000 scn
|
||||
3.000000 148.000000 m
|
||||
3.000000 161.254837 13.745167 172.000000 27.000000 172.000000 c
|
||||
203.000000 172.000000 l
|
||||
216.254837 172.000000 227.000000 161.254837 227.000000 148.000000 c
|
||||
227.000000 21.000000 l
|
||||
227.000000 7.745163 216.254837 -3.000000 203.000000 -3.000000 c
|
||||
27.000002 -3.000000 l
|
||||
13.745169 -3.000000 3.000000 7.745163 3.000000 21.000000 c
|
||||
3.000000 148.000000 l
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
|
||||
0.397431 0.424355 0.491667 scn
|
||||
0.000000 154.000000 m
|
||||
0.000000 168.911697 12.088313 181.000000 27.000000 181.000000 c
|
||||
203.000000 181.000000 l
|
||||
217.911682 181.000000 230.000000 168.911682 230.000000 154.000000 c
|
||||
230.000000 27.000000 l
|
||||
230.000000 12.088303 217.911682 0.000000 203.000000 0.000000 c
|
||||
27.000002 0.000000 l
|
||||
12.088314 0.000000 0.000000 12.088318 0.000000 27.000000 c
|
||||
0.000000 154.000000 l
|
||||
h
|
||||
27.000000 175.000000 m
|
||||
15.402020 175.000000 6.000000 165.597977 6.000000 154.000000 c
|
||||
6.000000 27.000000 l
|
||||
6.000000 15.402023 15.402022 6.000000 27.000002 6.000000 c
|
||||
203.000000 6.000000 l
|
||||
214.597977 6.000000 224.000000 15.402023 224.000000 27.000000 c
|
||||
224.000000 154.000000 l
|
||||
224.000000 165.597977 214.597977 175.000000 203.000000 175.000000 c
|
||||
27.000000 175.000000 l
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
q
|
||||
/E2 gs
|
||||
1.000000 0.000000 -0.000000 1.000000 0.000000 150.000000 cm
|
||||
1.000000 1.000000 1.000000 scn
|
||||
22.000000 -115.000000 m
|
||||
22.000000 -108.924866 26.924868 -104.000000 33.000000 -104.000000 c
|
||||
197.000000 -104.000000 l
|
||||
203.075134 -104.000000 208.000000 -108.924866 208.000000 -115.000000 c
|
||||
208.000000 -124.000000 l
|
||||
208.000000 -130.075134 203.075134 -135.000000 197.000000 -135.000000 c
|
||||
33.000000 -135.000000 l
|
||||
26.924868 -135.000000 22.000000 -130.075134 22.000000 -124.000000 c
|
||||
22.000000 -115.000000 l
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 0.000000 163.000000 cm
|
||||
0.368627 0.772549 0.309804 scn
|
||||
30.000000 -127.000000 m
|
||||
30.000000 -124.790863 31.790861 -123.000000 34.000000 -123.000000 c
|
||||
44.000000 -123.000000 l
|
||||
46.209137 -123.000000 48.000000 -124.790863 48.000000 -127.000000 c
|
||||
48.000000 -137.000000 l
|
||||
48.000000 -139.209137 46.209137 -141.000000 44.000000 -141.000000 c
|
||||
34.000000 -141.000000 l
|
||||
31.790861 -141.000000 30.000000 -139.209137 30.000000 -137.000000 c
|
||||
30.000000 -127.000000 l
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 0.000000 163.000000 cm
|
||||
1.000000 1.000000 1.000000 scn
|
||||
55.000000 -127.000000 m
|
||||
55.000000 -124.790863 56.790863 -123.000000 59.000000 -123.000000 c
|
||||
69.000000 -123.000000 l
|
||||
71.209137 -123.000000 73.000000 -124.790863 73.000000 -127.000000 c
|
||||
73.000000 -137.000000 l
|
||||
73.000000 -139.209137 71.209137 -141.000000 69.000000 -141.000000 c
|
||||
59.000000 -141.000000 l
|
||||
56.790863 -141.000000 55.000000 -139.209137 55.000000 -137.000000 c
|
||||
55.000000 -127.000000 l
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 0.000000 163.000000 cm
|
||||
1.000000 0.112500 0.203193 scn
|
||||
81.000000 -127.000000 m
|
||||
81.000000 -124.790863 82.790863 -123.000000 85.000000 -123.000000 c
|
||||
95.000000 -123.000000 l
|
||||
97.209137 -123.000000 99.000000 -124.790863 99.000000 -127.000000 c
|
||||
99.000000 -137.000000 l
|
||||
99.000000 -139.209137 97.209137 -141.000000 95.000000 -141.000000 c
|
||||
85.000000 -141.000000 l
|
||||
82.790863 -141.000000 81.000000 -139.209137 81.000000 -137.000000 c
|
||||
81.000000 -127.000000 l
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 0.000000 163.000000 cm
|
||||
0.286146 0.837500 0.774975 scn
|
||||
131.000000 -127.000000 m
|
||||
131.000000 -124.790863 132.790863 -123.000000 135.000000 -123.000000 c
|
||||
145.000000 -123.000000 l
|
||||
147.209137 -123.000000 149.000000 -124.790863 149.000000 -127.000000 c
|
||||
149.000000 -137.000000 l
|
||||
149.000000 -139.209137 147.209137 -141.000000 145.000000 -141.000000 c
|
||||
135.000000 -141.000000 l
|
||||
132.790863 -141.000000 131.000000 -139.209137 131.000000 -137.000000 c
|
||||
131.000000 -127.000000 l
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 0.000000 163.000000 cm
|
||||
0.219608 0.670588 0.921569 scn
|
||||
106.000000 -127.000000 m
|
||||
106.000000 -124.790863 107.790863 -123.000000 110.000000 -123.000000 c
|
||||
120.000000 -123.000000 l
|
||||
122.209137 -123.000000 124.000000 -124.790863 124.000000 -127.000000 c
|
||||
124.000000 -137.000000 l
|
||||
124.000000 -139.209137 122.209137 -141.000000 120.000000 -141.000000 c
|
||||
110.000000 -141.000000 l
|
||||
107.790863 -141.000000 106.000000 -139.209137 106.000000 -137.000000 c
|
||||
106.000000 -127.000000 l
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 0.000000 163.000000 cm
|
||||
0.519271 0.870833 0.468073 scn
|
||||
157.000000 -127.000000 m
|
||||
157.000000 -124.790863 158.790863 -123.000000 161.000000 -123.000000 c
|
||||
171.000000 -123.000000 l
|
||||
173.209137 -123.000000 175.000000 -124.790863 175.000000 -127.000000 c
|
||||
175.000000 -137.000000 l
|
||||
175.000000 -139.209137 173.209137 -141.000000 171.000000 -141.000000 c
|
||||
161.000000 -141.000000 l
|
||||
158.790863 -141.000000 157.000000 -139.209137 157.000000 -137.000000 c
|
||||
157.000000 -127.000000 l
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 0.000000 163.000000 cm
|
||||
1.000000 1.000000 1.000000 scn
|
||||
182.000000 -127.000000 m
|
||||
182.000000 -124.790863 183.790863 -123.000000 186.000000 -123.000000 c
|
||||
196.000000 -123.000000 l
|
||||
198.209137 -123.000000 200.000000 -124.790863 200.000000 -127.000000 c
|
||||
200.000000 -137.000000 l
|
||||
200.000000 -139.209137 198.209137 -141.000000 196.000000 -141.000000 c
|
||||
186.000000 -141.000000 l
|
||||
183.790863 -141.000000 182.000000 -139.209137 182.000000 -137.000000 c
|
||||
182.000000 -127.000000 l
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
4 0 obj
|
||||
5830
|
||||
endobj
|
||||
|
||||
5 0 obj
|
||||
<< /Type /XObject
|
||||
/Length 6 0 R
|
||||
/Group << /Type /Group
|
||||
/S /Transparency
|
||||
>>
|
||||
/Subtype /Form
|
||||
/Resources << >>
|
||||
/BBox [ 0.000000 0.000000 230.000000 130.000000 ]
|
||||
>>
|
||||
stream
|
||||
/DeviceRGB CS
|
||||
/DeviceRGB cs
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
|
||||
0.000000 0.000000 0.000000 scn
|
||||
0.000000 130.000000 m
|
||||
230.000000 130.000000 l
|
||||
230.000000 0.000000 l
|
||||
0.000000 0.000000 l
|
||||
0.000000 130.000000 l
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
6 0 obj
|
||||
237
|
||||
endobj
|
||||
|
||||
7 0 obj
|
||||
<< /XObject << /X1 3 0 R >>
|
||||
/ExtGState << /E1 << /SMask << /Type /Mask
|
||||
/G 5 0 R
|
||||
/S /Alpha
|
||||
>>
|
||||
/Type /ExtGState
|
||||
>> >>
|
||||
>>
|
||||
endobj
|
||||
|
||||
8 0 obj
|
||||
<< /Length 9 0 R >>
|
||||
stream
|
||||
/DeviceRGB CS
|
||||
/DeviceRGB cs
|
||||
q
|
||||
/E1 gs
|
||||
/X1 Do
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
9 0 obj
|
||||
46
|
||||
endobj
|
||||
|
||||
10 0 obj
|
||||
<< /Annots []
|
||||
/Type /Page
|
||||
/MediaBox [ 0.000000 0.000000 230.000000 130.000000 ]
|
||||
/Resources 7 0 R
|
||||
/Contents 8 0 R
|
||||
/Parent 11 0 R
|
||||
>>
|
||||
endobj
|
||||
|
||||
11 0 obj
|
||||
<< /Kids [ 10 0 R ]
|
||||
/Count 1
|
||||
/Type /Pages
|
||||
>>
|
||||
endobj
|
||||
|
||||
12 0 obj
|
||||
<< /Pages 11 0 R
|
||||
/Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
|
||||
xref
|
||||
0 13
|
||||
0000000000 65535 f
|
||||
0000000010 00000 n
|
||||
0000000531 00000 n
|
||||
0000000553 00000 n
|
||||
0000007540 00000 n
|
||||
0000007563 00000 n
|
||||
0000008050 00000 n
|
||||
0000008072 00000 n
|
||||
0000008370 00000 n
|
||||
0000008472 00000 n
|
||||
0000008493 00000 n
|
||||
0000008670 00000 n
|
||||
0000008746 00000 n
|
||||
trailer
|
||||
<< /ID [ (some) (id) ]
|
||||
/Root 12 0 R
|
||||
/Size 13
|
||||
>>
|
||||
startxref
|
||||
8807
|
||||
%%EOF
|
||||
15
Signal/Images.xcassets/homescreen_ios.imageset/Contents.json
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "homescreen_ios.pdf",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
||||
1058
Signal/Images.xcassets/homescreen_ios.imageset/homescreen_ios.pdf
vendored
Normal file
15
Signal/Images.xcassets/homescreen_ipados.imageset/Contents.json
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "homescreen_ipados.pdf",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
||||
BIN
Signal/Images.xcassets/homescreen_ipados.imageset/homescreen_ipados.pdf
vendored
Normal file
@ -0,0 +1,354 @@
|
||||
//
|
||||
// Copyright 2023 Signal Messenger, LLC
|
||||
// SPDX-License-Identifier: AGPL-3.0-only
|
||||
//
|
||||
|
||||
import SignalUI
|
||||
import SignalMessaging
|
||||
|
||||
// MARK: - AppIcon
|
||||
|
||||
enum CustomAppIcon: String {
|
||||
case white = "AppIcon-white"
|
||||
case color = "AppIcon-color"
|
||||
case dark = "AppIcon-dark"
|
||||
case darkVariant = "AppIcon-dark-variant"
|
||||
case chat = "AppIcon-chat"
|
||||
case bubbles = "AppIcon-bubbles"
|
||||
case yellow = "AppIcon-yellow"
|
||||
case news = "AppIcon-news"
|
||||
case notes = "AppIcon-notes"
|
||||
case weather = "AppIcon-weather"
|
||||
case wave = "AppIcon-wave"
|
||||
|
||||
static func iconIsSelected(customIcon: CustomAppIcon?) -> Bool {
|
||||
UIApplication.shared.alternateIconName == customIcon?.rawValue
|
||||
}
|
||||
|
||||
/// The name for the preview image for the default app icon.
|
||||
///
|
||||
/// If you try to load the full app icon set into a `UIImage`, it loads a
|
||||
/// low-resolution version of it, so this needs to be a separate image set.
|
||||
/// Even Apple's own demo project has low-resolution picker images
|
||||
/// because they didn't do this.
|
||||
static let defaultAppIconPreviewImageName = "AppIcon_preview"
|
||||
|
||||
static var currentIconImageName: String {
|
||||
UIApplication.shared.alternateIconName ?? defaultAppIconPreviewImageName
|
||||
}
|
||||
|
||||
/// Indicates if the icon should be rendered with a shadow in the picker.
|
||||
///
|
||||
/// Some icons have a white background and should show a subtle
|
||||
/// shadow in the picker to separate it from the background.
|
||||
var shouldShowShadow: Bool {
|
||||
switch self {
|
||||
case .color, .dark, .darkVariant, .chat, .yellow, .news, .notes, .weather, .wave:
|
||||
return false
|
||||
case .white, .bubbles:
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - AppIconLearnMoreTableViewController
|
||||
|
||||
private class AppIconLearnMoreTableViewController: OWSTableViewController2 {
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
updateTableContents()
|
||||
|
||||
navigationItem.leftBarButtonItem = .init(
|
||||
barButtonSystemItem: .done,
|
||||
target: self, action: #selector(didTapDone),
|
||||
accessibilityIdentifier: "AppIconLearnMoreTableViewController.done"
|
||||
)
|
||||
}
|
||||
|
||||
override func themeDidChange() {
|
||||
super.themeDidChange()
|
||||
updateTableContents()
|
||||
}
|
||||
|
||||
private func updateTableContents() {
|
||||
let contents = OWSTableContents()
|
||||
|
||||
let topSection = OWSTableSection()
|
||||
topSection.headerAttributedTitle = NSAttributedString(
|
||||
string: OWSLocalizedString(
|
||||
"SETTINGS_APP_ICON_EDUCATION_APP_NAME",
|
||||
comment: "Information on sheet about changing the app icon - first line"
|
||||
)
|
||||
)
|
||||
.styled(
|
||||
with: .font(.dynamicTypeSubheadlineClamped),
|
||||
.color(Theme.secondaryTextAndIconColor)
|
||||
)
|
||||
topSection.add(.init(customCellBlock: { [weak self] in
|
||||
let homescreenImageName = UIDevice.current.isIPad ? "homescreen_ipados" : "homescreen_ios"
|
||||
return self?.createCell(
|
||||
with: homescreenImageName,
|
||||
insets: .init(hMargin: 48, vMargin: 24)
|
||||
) ?? UITableViewCell()
|
||||
}))
|
||||
topSection.shouldDisableCellSelection = true
|
||||
|
||||
let bottomSection = OWSTableSection()
|
||||
bottomSection.headerAttributedTitle = NSAttributedString(
|
||||
string: OWSLocalizedString(
|
||||
"SETTINGS_APP_ICON_EDUCATION_HOME_SCREEN_DOCK",
|
||||
comment: "Information on sheet about changing the app icon - second line"
|
||||
)
|
||||
)
|
||||
.styled(
|
||||
with: .font(.dynamicTypeSubheadlineClamped),
|
||||
.color(Theme.secondaryTextAndIconColor)
|
||||
)
|
||||
bottomSection.add(.init(customCellBlock: { [weak self] in
|
||||
let dockImageName = UIDevice.current.isIPad ? "dock_ipados" : "dock_ios"
|
||||
return self?.createCell(
|
||||
with: dockImageName,
|
||||
insets: .init(top: 0, leading: 16, bottom: 29, trailing: 16)
|
||||
) ?? UITableViewCell()
|
||||
}))
|
||||
bottomSection.shouldDisableCellSelection = true
|
||||
|
||||
contents.add(sections: [topSection, bottomSection])
|
||||
self.contents = contents
|
||||
}
|
||||
|
||||
private func createCell(
|
||||
with image: String,
|
||||
insets: UIEdgeInsets
|
||||
) -> UITableViewCell {
|
||||
let cell = OWSTableItem.newCell()
|
||||
let image = UIImage(named: image)
|
||||
let imageView = UIImageView(image: image)
|
||||
imageView.contentMode = .scaleAspectFit
|
||||
cell.contentView.addSubview(imageView)
|
||||
imageView.autoPinEdgesToSuperviewEdges(with: insets)
|
||||
return cell
|
||||
}
|
||||
|
||||
@objc
|
||||
private func didTapDone() {
|
||||
dismiss(animated: true)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - AppIconSettingsTableViewControllerDelegate
|
||||
|
||||
protocol AppIconSettingsTableViewControllerDelegate: AnyObject {
|
||||
func didChangeIcon()
|
||||
}
|
||||
|
||||
// MARK: - AppIconSettingsTableViewController
|
||||
|
||||
class AppIconSettingsTableViewController: OWSTableViewController2 {
|
||||
|
||||
// MARK: Static properties
|
||||
|
||||
private static let customIcons: [[CustomAppIcon?]] = [
|
||||
[.none, .white, .color, .dark],
|
||||
[.darkVariant, .chat, .bubbles, .yellow],
|
||||
[.news, .notes, .weather, .wave],
|
||||
]
|
||||
|
||||
/// This URL itself is not used. The action is overridden in the text view delegate function.
|
||||
private static let learnMoreURL = URL(string: "https://support.signal.org/")!
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
weak var iconDelegate: AppIconSettingsTableViewControllerDelegate?
|
||||
private var stackView: UIStackView?
|
||||
|
||||
// MARK: View lifecycle
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
title = OWSLocalizedString(
|
||||
"SETTINGS_APP_ICON_TITLE",
|
||||
comment: "The title for the app icon selection settings page."
|
||||
)
|
||||
updateTableContents()
|
||||
}
|
||||
|
||||
override func themeDidChange() {
|
||||
super.themeDidChange()
|
||||
updateTableContents()
|
||||
}
|
||||
|
||||
// MARK: Table setup
|
||||
|
||||
private func updateTableContents() {
|
||||
let contents = OWSTableContents()
|
||||
|
||||
let section = OWSTableSection()
|
||||
section.add(.init(customCellBlock: { [weak self] in
|
||||
guard let self else { return UITableViewCell() }
|
||||
return self.buildIconSelectionCell()
|
||||
}))
|
||||
section.footerAttributedTitle = NSAttributedString.composed(of: [
|
||||
OWSLocalizedString(
|
||||
"SETTINGS_APP_ICON_FOOTER",
|
||||
comment: "The footer for the app icon selection settings page."
|
||||
),
|
||||
"\n",
|
||||
CommonStrings.learnMore.styled(with: .link(Self.learnMoreURL))
|
||||
])
|
||||
.styled(
|
||||
with: .font(.dynamicTypeCaption1Clamped),
|
||||
.color(Theme.secondaryTextAndIconColor)
|
||||
)
|
||||
section.footerTextViewDelegate = self
|
||||
section.shouldDisableCellSelection = true
|
||||
|
||||
contents.add(section)
|
||||
self.contents = contents
|
||||
}
|
||||
|
||||
private func buildIconSelectionCell() -> UITableViewCell {
|
||||
let rows = Self.customIcons.map { row in
|
||||
let icons = row.map { icon in
|
||||
IconButton(icon: icon) { [weak self] in
|
||||
self?.didTapIcon(icon)
|
||||
}
|
||||
}
|
||||
let stackView = UIStackView(arrangedSubviews: [SpacerView(preferredWidth: 0)] + icons + [SpacerView(preferredWidth: 0)])
|
||||
stackView.axis = .horizontal
|
||||
stackView.distribution = .equalSpacing
|
||||
stackView.alignment = .center
|
||||
return stackView
|
||||
}
|
||||
|
||||
let stackView = UIStackView(arrangedSubviews: rows)
|
||||
stackView.axis = .vertical
|
||||
stackView.spacing = 32
|
||||
stackView.distribution = .fillEqually
|
||||
stackView.alignment = .fill
|
||||
|
||||
let iconSize: CGFloat
|
||||
if UIDevice.current.isNarrowerThanIPhone6 {
|
||||
iconSize = 56
|
||||
} else {
|
||||
iconSize = 60
|
||||
}
|
||||
|
||||
stackView.arrangedSubviews
|
||||
.compactMap { $0 as? UIStackView }
|
||||
.flatMap(\.arrangedSubviews)
|
||||
.forEach { view in
|
||||
if view is SpacerView {
|
||||
return
|
||||
}
|
||||
view.autoSetDimensions(to: .square(iconSize))
|
||||
}
|
||||
|
||||
self.stackView = stackView
|
||||
let cell = OWSTableItem.newCell()
|
||||
cell.contentView.addSubview(stackView)
|
||||
stackView.autoPinEdgesToSuperviewEdges(with: .init(hMargin: /*24 +*/ 16, vMargin: 24))
|
||||
return cell
|
||||
}
|
||||
|
||||
private func didTapLearnMore() {
|
||||
let learnMoreViewController = AppIconLearnMoreTableViewController()
|
||||
let navigationController = OWSNavigationController(rootViewController: learnMoreViewController)
|
||||
presentFormSheet(navigationController, animated: true)
|
||||
}
|
||||
|
||||
private func didTapIcon(_ icon: CustomAppIcon?) {
|
||||
guard !CustomAppIcon.iconIsSelected(customIcon: icon) else { return }
|
||||
|
||||
UIApplication.shared.setAlternateIconName(icon?.rawValue) { error in
|
||||
if let error {
|
||||
owsFailDebug("Failed to update app icon: \(error)")
|
||||
}
|
||||
}
|
||||
updateIconSelection()
|
||||
iconDelegate?.didChangeIcon()
|
||||
}
|
||||
|
||||
private func updateIconSelection() {
|
||||
let animator = UIViewPropertyAnimator(duration: 0.15, springDamping: 1, springResponse: 0.15)
|
||||
animator.addAnimations {
|
||||
self.stackView?.arrangedSubviews
|
||||
.compactMap { $0 as? UIStackView }
|
||||
.flatMap(\.arrangedSubviews)
|
||||
.forEach { view in
|
||||
guard let iconButton = view as? IconButton else { return }
|
||||
iconButton.updateSelectedState()
|
||||
}
|
||||
}
|
||||
animator.startAnimation()
|
||||
}
|
||||
|
||||
private class IconButton: UIView {
|
||||
let icon: CustomAppIcon?
|
||||
private let button: UIView
|
||||
private let selectedOutlineView: UIView
|
||||
|
||||
init(icon: CustomAppIcon?, action: @escaping () -> Void) {
|
||||
self.icon = icon
|
||||
self.button = Self.makeButton(for: icon, action: action)
|
||||
self.selectedOutlineView = UIView.container()
|
||||
super.init(frame: .zero)
|
||||
|
||||
self.addSubview(selectedOutlineView)
|
||||
selectedOutlineView.autoPinEdgesToSuperviewEdges()
|
||||
selectedOutlineView.layer.cornerRadius = Self.cornerRadius
|
||||
let borderColor: UIColor = Theme.isDarkThemeEnabled ? .ows_gray05 : .ows_black
|
||||
selectedOutlineView.layer.borderColor = borderColor.cgColor
|
||||
|
||||
selectedOutlineView.addSubview(button)
|
||||
button.autoPinEdgesToSuperviewEdges()
|
||||
|
||||
updateSelectedState()
|
||||
}
|
||||
|
||||
required init?(coder: NSCoder) {
|
||||
fatalError("init(coder:) has not been implemented")
|
||||
}
|
||||
|
||||
func updateSelectedState() {
|
||||
if CustomAppIcon.iconIsSelected(customIcon: icon) {
|
||||
button.transform = .scale(0.8)
|
||||
selectedOutlineView.layer.borderWidth = 3
|
||||
} else {
|
||||
button.transform = .identity
|
||||
selectedOutlineView.layer.borderWidth = 0
|
||||
}
|
||||
}
|
||||
|
||||
static let cornerRadius: CGFloat = 12
|
||||
|
||||
private static func makeButton(for icon: CustomAppIcon?, action: @escaping () -> Void) -> UIView {
|
||||
let image = UIImage(named: icon?.rawValue ?? CustomAppIcon.defaultAppIconPreviewImageName)
|
||||
let button = OWSButton(block: action)
|
||||
button.setImage(image, for: .normal)
|
||||
button.clipsToBounds = true
|
||||
button.layer.cornerRadius = cornerRadius
|
||||
|
||||
if icon?.shouldShowShadow == true {
|
||||
let backgroundView = UIView.container()
|
||||
backgroundView.setShadow(radius: 2, opacity: 1, offset: .zero, color: .ows_blackAlpha25)
|
||||
backgroundView.addSubview(button)
|
||||
button.autoPinEdgesToSuperviewEdges()
|
||||
return backgroundView
|
||||
}
|
||||
|
||||
return button
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: UITextViewDelegate
|
||||
|
||||
extension AppIconSettingsTableViewController: UITextViewDelegate {
|
||||
func textView(_ textView: UITextView, shouldInteractWith url: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
|
||||
if url == Self.learnMoreURL {
|
||||
didTapLearnMore()
|
||||
}
|
||||
return false
|
||||
}
|
||||
}
|
||||
@ -44,6 +44,25 @@ class AppearanceSettingsTableViewController: OWSTableViewController2 {
|
||||
let vc = ColorAndWallpaperSettingsViewController()
|
||||
self.navigationController?.pushViewController(vc, animated: true)
|
||||
})
|
||||
firstSection.add(
|
||||
OWSTableItem(
|
||||
customCellBlock: { [weak self] in
|
||||
OWSTableItem.buildCell(
|
||||
itemName: OWSLocalizedString(
|
||||
"SETTINGS_APPEARANCE_APP_ICON",
|
||||
comment: "The title for the app icon section in the appearance settings."
|
||||
),
|
||||
accessoryType: .disclosureIndicator,
|
||||
accessoryContentView: self?.buildCurrentAppIconView())
|
||||
},
|
||||
actionBlock: { [weak self] in
|
||||
guard let self else { return }
|
||||
let vc = AppIconSettingsTableViewController()
|
||||
vc.iconDelegate = self
|
||||
self.navigationController?.pushViewController(vc, animated: true)
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
contents.add(firstSection)
|
||||
|
||||
@ -54,33 +73,20 @@ class AppearanceSettingsTableViewController: OWSTableViewController2 {
|
||||
self.contents = contents
|
||||
}
|
||||
|
||||
private func appearanceItem(_ mode: Theme.Mode) -> OWSTableItem {
|
||||
return OWSTableItem(
|
||||
text: nameForThemeMode(mode),
|
||||
actionBlock: { [weak self] in
|
||||
self?.changeThemeMode(mode)
|
||||
},
|
||||
accessoryType: Theme.getOrFetchCurrentMode() == mode ? .checkmark : .none
|
||||
)
|
||||
}
|
||||
|
||||
private func changeThemeMode(_ mode: Theme.Mode) {
|
||||
Theme.setCurrentMode(mode)
|
||||
updateTableContents()
|
||||
}
|
||||
|
||||
private var currentThemeName: String {
|
||||
return nameForThemeMode(Theme.getOrFetchCurrentMode())
|
||||
}
|
||||
|
||||
private func nameForThemeMode(_ mode: Theme.Mode) -> String {
|
||||
switch mode {
|
||||
case .dark:
|
||||
return OWSLocalizedString("APPEARANCE_SETTINGS_DARK_THEME_NAME", comment: "Name indicating that the dark theme is enabled.")
|
||||
case .light:
|
||||
return OWSLocalizedString("APPEARANCE_SETTINGS_LIGHT_THEME_NAME", comment: "Name indicating that the light theme is enabled.")
|
||||
case .system:
|
||||
return OWSLocalizedString("APPEARANCE_SETTINGS_SYSTEM_THEME_NAME", comment: "Name indicating that the system theme is enabled.")
|
||||
}
|
||||
private func buildCurrentAppIconView() -> UIView {
|
||||
let image = UIImage(named: CustomAppIcon.currentIconImageName)
|
||||
let imageView = UIImageView(image: image)
|
||||
imageView.autoSetDimensions(to: .square(24))
|
||||
// 60x60 icons have corner radius 12
|
||||
// 12 * (24/60) = 4.8
|
||||
imageView.layer.cornerRadius = 4.8
|
||||
imageView.clipsToBounds = true
|
||||
return imageView
|
||||
}
|
||||
}
|
||||
|
||||
extension AppearanceSettingsTableViewController: AppIconSettingsTableViewControllerDelegate {
|
||||
func didChangeIcon() {
|
||||
updateTableContents()
|
||||
}
|
||||
}
|
||||
|
||||
@ -5806,6 +5806,21 @@
|
||||
/* No comment provided by engineer. */
|
||||
"SETTINGS_ADVANCED_VIEW_ERROR_LOG" = "Error Logs";
|
||||
|
||||
/* Information on sheet about changing the app icon - first line */
|
||||
"SETTINGS_APP_ICON_EDUCATION_APP_NAME" = "The app name “Signal” will be visible on the home screen, in notifications and the app library.";
|
||||
|
||||
/* Information on sheet about changing the app icon - second line */
|
||||
"SETTINGS_APP_ICON_EDUCATION_HOME_SCREEN_DOCK" = "You can hide the app name “Signal” from the home screen by moving the app to the dock at the bottom of the home screen.";
|
||||
|
||||
/* The footer for the app icon selection settings page. */
|
||||
"SETTINGS_APP_ICON_FOOTER" = "The app name “Signal” will be visible on the Home Screen, in Notifications and the App Library.";
|
||||
|
||||
/* The title for the app icon selection settings page. */
|
||||
"SETTINGS_APP_ICON_TITLE" = "App Icon";
|
||||
|
||||
/* The title for the app icon section in the appearance settings. */
|
||||
"SETTINGS_APPEARANCE_APP_ICON" = "App Icon";
|
||||
|
||||
/* Footer for avatar section in appearance settings */
|
||||
"SETTINGS_APPEARANCE_AVATAR_FOOTER" = "Display system contact photos if available.";
|
||||
|
||||
|
||||
@ -17,6 +17,9 @@ public class OWSTableSection {
|
||||
public var headerAttributedTitle: NSAttributedString?
|
||||
public var footerAttributedTitle: NSAttributedString?
|
||||
|
||||
public var headerTextViewDelegate: UITextViewDelegate?
|
||||
public var footerTextViewDelegate: UITextViewDelegate?
|
||||
|
||||
public var customHeaderView: UIView?
|
||||
public var customHeaderHeight: CGFloat?
|
||||
|
||||
|
||||
@ -738,7 +738,9 @@ extension OWSTableViewController2: UITableViewDataSource, UITableViewDelegate, O
|
||||
}
|
||||
|
||||
public func buildHeaderTextView(forSection section: OWSTableSection) -> UITextView {
|
||||
buildHeaderTextView(withDeepInsets: section.hasBackground)
|
||||
let textView = buildHeaderTextView(withDeepInsets: section.hasBackground)
|
||||
textView.delegate = section.headerTextViewDelegate
|
||||
return textView
|
||||
}
|
||||
|
||||
public func buildHeaderTextView(withDeepInsets: Bool) -> UITextView {
|
||||
@ -752,7 +754,9 @@ extension OWSTableViewController2: UITableViewDataSource, UITableViewDelegate, O
|
||||
}
|
||||
|
||||
public func buildFooterTextView(forSection section: OWSTableSection) -> UITextView {
|
||||
buildFooterTextView(withDeepInsets: section.hasBackground)
|
||||
let textView = buildFooterTextView(withDeepInsets: section.hasBackground)
|
||||
textView.delegate = section.footerTextViewDelegate
|
||||
return textView
|
||||
}
|
||||
|
||||
public func buildFooterTextView(withDeepInsets: Bool) -> UITextView {
|
||||
|
||||