Add ability to change app icon

This commit is contained in:
Elaine 2023-09-08 12:16:56 -06:00 committed by GitHub
parent ddac07f845
commit 5aac1b2154
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
39 changed files with 2378 additions and 30 deletions

View File

@ -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;

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

View File

@ -0,0 +1,14 @@
{
"images" : [
{
"filename" : "Bubbles_1024x1024.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

View File

@ -0,0 +1,14 @@
{
"images" : [
{
"filename" : "Chat_1024x1024.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,14 @@
{
"images" : [
{
"filename" : "SignalColor_1024x1024.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

View File

@ -0,0 +1,14 @@
{
"images" : [
{
"filename" : "SignalDarkVariant_1024x1024.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

View File

@ -0,0 +1,14 @@
{
"images" : [
{
"filename" : "SignalDark_1024x1024.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

View File

@ -0,0 +1,14 @@
{
"images" : [
{
"filename" : "News_1024x1024.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -0,0 +1,14 @@
{
"images" : [
{
"filename" : "Notes_1024x1024.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

View File

@ -0,0 +1,14 @@
{
"images" : [
{
"filename" : "Waves_1024x1024.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

View File

@ -0,0 +1,14 @@
{
"images" : [
{
"filename" : "Weather_1024x1024.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

View File

@ -0,0 +1,14 @@
{
"images" : [
{
"filename" : "SignalWhite_1024x1024.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

View File

@ -0,0 +1,14 @@
{
"images" : [
{
"filename" : "Yellow_1024x1024.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

View 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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "dock_ios.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View 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

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "dock_ipados.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View 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

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "homescreen_ios.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "homescreen_ipados.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View 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
}
}

View File

@ -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()
}
}

View File

@ -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.";

View File

@ -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?

View File

@ -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 {