@maccesar/titools 5.2.5 → 5.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRIBUTING.md +1 -1
- package/README.md +58 -97
- package/agents/ti-pro.md +4 -2
- package/commands/ti-audit.md +7 -5
- package/docs/examples.md +24 -13
- package/docs/knowledge-index.md +2 -1
- package/lib/config.js +1 -0
- package/package.json +1 -1
- package/skills/alloy-guides/SKILL.md +18 -179
- package/skills/alloy-guides/references/CLI_TASKS.md +17 -216
- package/skills/alloy-guides/references/CONCEPTS.md +27 -162
- package/skills/alloy-guides/references/CONTROLLERS.md +38 -236
- package/skills/alloy-guides/references/MODELS.md +47 -723
- package/skills/alloy-guides/references/MODELS_ADVANCED.md +21 -482
- package/skills/alloy-guides/references/VIEWS_DYNAMIC.md +12 -222
- package/skills/alloy-guides/references/VIEWS_STYLES.md +39 -358
- package/skills/alloy-guides/references/VIEWS_XML.md +36 -552
- package/skills/alloy-guides/references/WIDGETS.md +49 -127
- package/skills/alloy-howtos/SKILL.md +14 -169
- package/skills/alloy-howtos/references/best_practices.md +9 -113
- package/skills/alloy-howtos/references/cli_reference.md +18 -223
- package/skills/alloy-howtos/references/config_files.md +50 -133
- package/skills/alloy-howtos/references/debugging_troubleshooting.md +19 -63
- package/skills/alloy-howtos/references/samples.md +21 -138
- package/skills/ti-api/SKILL.md +10 -2
- package/skills/ti-api/references/api-android.md +36 -2
- package/skills/ti-api/references/api-app-platform.md +39 -3
- package/skills/ti-api/references/api-core.md +50 -18
- package/skills/ti-api/references/api-data-network.md +49 -35
- package/skills/ti-api/references/api-media.md +45 -27
- package/skills/ti-api/references/api-services.md +39 -9
- package/skills/ti-api/references/api-ui-android.md +33 -13
- package/skills/ti-api/references/api-ui-extras.md +41 -15
- package/skills/ti-api/references/api-ui-ios-animator.md +42 -26
- package/skills/ti-api/references/api-ui-ios.md +74 -2
- package/skills/ti-api/references/api-ui-lists.md +32 -16
- package/skills/ti-api/references/api-ui-text-input.md +34 -17
- package/skills/ti-api/references/api-ui-views.md +27 -1
- package/skills/ti-api/references/api-ui-windows-navigation.md +32 -18
- package/skills/ti-api/references/api-xml-global.md +66 -16
- package/skills/ti-create-release/SKILL.md +98 -0
- package/skills/ti-create-release/references/module-discovery.md +69 -0
- package/skills/ti-expert/references/adaptive-layouts.md +1 -1
- package/skills/ti-guides/SKILL.md +37 -76
- package/skills/ti-guides/references/advanced-data-and-images.md +122 -126
- package/skills/ti-guides/references/android-manifest.md +24 -83
- package/skills/ti-guides/references/app-distribution.md +31 -377
- package/skills/ti-guides/references/application-frameworks.md +127 -335
- package/skills/ti-guides/references/cli-reference.md +184 -633
- package/skills/ti-guides/references/commonjs-advanced.md +81 -231
- package/skills/ti-guides/references/compatibility-matrix.md +36 -75
- package/skills/ti-guides/references/hello-world.md +95 -70
- package/skills/ti-guides/references/hyperloop-native-access.md +52 -448
- package/skills/ti-guides/references/resources.md +174 -142
- package/skills/ti-guides/references/sdk-release-notes.md +28 -71
- package/skills/ti-guides/references/tiapp-config.md +222 -598
- package/skills/ti-howtos/SKILL.md +23 -123
- package/skills/ti-howtos/references/cross-platform-development.md +119 -324
- package/skills/ti-howtos/references/debugging-profiling.md +77 -445
- package/skills/ti-howtos/references/extending-titanium.md +199 -673
- package/skills/ti-howtos/references/local-data-sources.md +87 -300
- package/skills/ti-howtos/references/location-and-maps.md +86 -213
- package/skills/ti-howtos/references/media-apis.md +103 -223
- package/skills/ti-howtos/references/notification-services.md +86 -506
- package/skills/ti-howtos/references/remote-data-sources.md +97 -316
- package/skills/ti-howtos/references/using-modules.md +77 -133
- package/skills/ti-synthengine/SKILL.md +62 -111
- package/skills/ti-synthengine/assets/example/README.md +50 -59
- package/skills/ti-synthengine/assets/example/app.js +67 -65
- package/skills/ti-synthengine/assets/example/lib/sequenceOwner.js +39 -40
- package/skills/ti-synthengine/assets/example/lib/soundPreset.js +34 -0
- package/skills/ti-synthengine/assets/index.d.ts +122 -2
- package/skills/ti-synthengine/references/advanced-examples.md +4 -4
- package/skills/ti-synthengine/references/api.md +40 -18
- package/skills/ti-synthengine/references/audio-engine.md +15 -57
- package/skills/ti-synthengine/references/examples.md +63 -6
- package/skills/ti-synthengine/references/guide.md +61 -57
- package/skills/ti-synthengine/references/instruments-and-effects.md +15 -15
- package/skills/ti-synthengine/references/native-variation.md +53 -14
- package/skills/ti-synthengine/references/recipes-interaction.md +25 -20
- package/skills/ti-synthengine/references/recipes.md +19 -16
- package/skills/ti-synthengine/references/recommendations.md +12 -12
- package/skills/ti-synthengine/references/sound-api.md +197 -0
- package/skills/ti-synthengine/references/sound-design.md +7 -7
- package/skills/ti-synthengine/references/source-notes.md +62 -172
- package/skills/ti-synthengine/references/troubleshooting.md +17 -19
- package/skills/ti-synthengine/references/upgrade-2.0.0.md +40 -0
- package/skills/ti-ui/SKILL.md +28 -143
- package/skills/ti-ui/references/icons-and-splash-screens.md +74 -403
- package/skills/ti-ui/references/layouts-and-positioning.md +175 -402
- package/skills/ti-ui/references/listviews-and-performance.md +100 -703
- package/skills/ti-ui/references/platform-conventions.md +180 -0
- package/skills/ti-ui/references/user-interface.md +43 -0
- package/skills/alloy-guides/references/VIEWS_WITHOUT_CONTROLLERS.md +0 -102
- package/skills/alloy-howtos/references/custom_tags.md +0 -148
- package/skills/ti-guides/references/coding-best-practices.md +0 -149
- package/skills/ti-guides/references/javascript-primer.md +0 -414
- package/skills/ti-guides/references/reserved-words.md +0 -36
- package/skills/ti-guides/references/style-and-conventions.md +0 -103
- package/skills/ti-howtos/references/android-platform-deep-dives.md +0 -624
- package/skills/ti-howtos/references/automation-fastlane-appium.md +0 -96
- package/skills/ti-howtos/references/buffer-codec-streams.md +0 -162
- package/skills/ti-howtos/references/google-maps-v2.md +0 -172
- package/skills/ti-howtos/references/ios-map-kit.md +0 -149
- package/skills/ti-howtos/references/ios-platform-deep-dives.md +0 -611
- package/skills/ti-howtos/references/tutorials.md +0 -565
- package/skills/ti-howtos/references/web-content-integration.md +0 -287
- package/skills/ti-howtos/references/webpack-build-pipeline.md +0 -124
- package/skills/ti-synthengine/references/android-sim80-correction-evidence.zip +0 -0
- package/skills/ti-synthengine/references/android-sim80-correction.json +0 -162
- package/skills/ti-synthengine/references/audio-pipeline-validation.md +0 -19
- package/skills/ti-synthengine/references/bypass-physical-recheck-evidence.zip +0 -0
- package/skills/ti-synthengine/references/frontier-android-evidence.zip +0 -0
- package/skills/ti-synthengine/references/frontier-ipad-evidence.zip +0 -0
- package/skills/ti-synthengine/references/frontier-physical-validation.json +0 -1918
- package/skills/ti-synthengine/references/native-tone-repetition-validation.md +0 -59
- package/skills/ti-synthengine/references/native-variation-proposal.md +0 -182
- package/skills/ti-synthengine/references/native-variation-validation.md +0 -63
- package/skills/ti-synthengine/references/performance-review-evidence.zip +0 -0
- package/skills/ti-synthengine/references/performance-review.json +0 -1146
- package/skills/ti-synthengine/references/physical-validation.json +0 -1457
- package/skills/ti-synthengine/references/source-snapshot.json +0 -542
- package/skills/ti-synthengine/references/stats-performance.json +0 -2992
- package/skills/ti-synthengine/references/stats-performance.md +0 -82
- package/skills/ti-synthengine/references/studio-validation.json +0 -6202
- package/skills/ti-synthengine/references/unified-bypass-performance.json +0 -22425
- package/skills/ti-synthengine/references/unified-validation.json +0 -314
- package/skills/ti-ui/references/accessibility-deep-dive.md +0 -288
- package/skills/ti-ui/references/animation-and-matrices.md +0 -569
- package/skills/ti-ui/references/application-structures.md +0 -626
- package/skills/ti-ui/references/custom-fonts-styling.md +0 -549
- package/skills/ti-ui/references/event-handling.md +0 -401
- package/skills/ti-ui/references/gestures.md +0 -448
- package/skills/ti-ui/references/orientation.md +0 -374
- package/skills/ti-ui/references/platform-ui-android.md +0 -727
- package/skills/ti-ui/references/platform-ui-ios.md +0 -576
- package/skills/ti-ui/references/scrolling-views.md +0 -288
- package/skills/ti-ui/references/tableviews.md +0 -542
|
@@ -1,314 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"schemaVersion": 1,
|
|
3
|
-
"date": "2026-10-23",
|
|
4
|
-
"moduleVersion": "1.0.0 beta",
|
|
5
|
-
"sourceState": "Native source committed; functional docs committed; physical validation recorded with explicit failed/open criteria",
|
|
6
|
-
"baselineRevision": "937e774db7c5a924c9162cf0bbd01cb546754231",
|
|
7
|
-
"implementation": "Unified native transport and selective processing implemented on Android and iOS; eight applications and module example use final API.",
|
|
8
|
-
"acceptanceComplete": false,
|
|
9
|
-
"nativeBuilds": {
|
|
10
|
-
"android": {
|
|
11
|
-
"result": "success",
|
|
12
|
-
"command": "ti build -p android --build-only --project-dir android --log-level info",
|
|
13
|
-
"sdk": "13.4.1.GA",
|
|
14
|
-
"sourceSha256": "205a3723b49a9ddce9926541015f8859e7f50b943057af73a98e6a516cd8520c",
|
|
15
|
-
"libraries": [
|
|
16
|
-
{
|
|
17
|
-
"abi": "arm64-v8a",
|
|
18
|
-
"bytes": 136376,
|
|
19
|
-
"sha256": "ba8c549914027fd0c0292d476244359358ed37106454b4b8f8ab0661f64f1392"
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
"abi": "armeabi-v7a",
|
|
23
|
-
"bytes": 103036,
|
|
24
|
-
"sha256": "9b1e459a82e3a46754d5988dc8210168bb84e6eea1df1368bd9479b91d8264bc"
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
"abi": "x86",
|
|
28
|
-
"bytes": 151560,
|
|
29
|
-
"sha256": "b531f915c5202613af7eeda9abe4d7f9e8b7f63459a4f4f4c8665d99653bb82b"
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
"abi": "x86_64",
|
|
33
|
-
"bytes": 148184,
|
|
34
|
-
"sha256": "7b0581450f815af78044a1bf80e6d66de949a27a8765b0d7571d3e62e111b787"
|
|
35
|
-
}
|
|
36
|
-
],
|
|
37
|
-
"aarMatchesBuild": true,
|
|
38
|
-
"sourceFilesSha256": {
|
|
39
|
-
"android/jni/SynthOboeEngine.cpp": "205a3723b49a9ddce9926541015f8859e7f50b943057af73a98e6a516cd8520c",
|
|
40
|
-
"android/src/ti/synthengine/SynthStudioContract.java": "27b94bcf653d6c239bcb92f537633435c04e664a55ab17cf93ede7dea7525d86",
|
|
41
|
-
"android/src/ti/synthengine/TiSynthEngineModule.java": "d2f904dbf688c7685d541edfea9fdfefbeef5c52493bc529ac4599c6eef4371e",
|
|
42
|
-
"shared/synth_spatial.h": "ba7eb24b4d4b05281d15af72fc4b100185ead954be05e4eacd082af213b3de7b"
|
|
43
|
-
},
|
|
44
|
-
"aarSha256": "9c4c712e590d4f15e94a2ee17931c7cb506879aa3c7bddbf58bd32335f07ef45",
|
|
45
|
-
"sourceUnchangedDuringBuild": true,
|
|
46
|
-
"productionContainsDiagnosticOrRejectedExperimentCode": false
|
|
47
|
-
},
|
|
48
|
-
"ios": {
|
|
49
|
-
"result": "success",
|
|
50
|
-
"command": "ti build -p ios --build-only --no-colors --no-progress-bars",
|
|
51
|
-
"sdk": "13.4.1.GA",
|
|
52
|
-
"sourceHeaders": {
|
|
53
|
-
"capturedAt": "2026-10-23T15:07:31.653644+00:00",
|
|
54
|
-
"files": {
|
|
55
|
-
"ios/Classes/TiSynthengineContract.h": "484c2b51afbeee17fa5b539f3211256d74c8ef0ad90f0c246229b8e70befc597",
|
|
56
|
-
"ios/Classes/TiSynthengineContract.m": "1feed79cdced5214a8dadd072ba32c2e82b9aa23d85ba279ea8bb8430f1993e9",
|
|
57
|
-
"ios/Classes/TiSynthengineModule.h": "30ba0b453ce12eb2717065efa23fb5ab53f901ad0a4d21166fae7f000c66f169",
|
|
58
|
-
"ios/Classes/TiSynthengineModule.m": "b3c7df467de24658140dfb671f94764686b27066be2920634044628feb8eb85c",
|
|
59
|
-
"ios/Classes/TiSynthengineModuleAssets.h": "186faae8e50f8e36c7a24abdfef856eb5977cff34fc75f5213287ebf45c4b4b4",
|
|
60
|
-
"ios/Classes/TiSynthengineModuleAssets.m": "d90360da150669219d27ee32c773781b2079163bc6185af75c857ee583ad04e3",
|
|
61
|
-
"shared/synth_core.h": "982f819f1450d5a5860133d1b46c5ad16d04e9663a83158314ed7bba3a6ff101",
|
|
62
|
-
"shared/synth_effects.h": "1d273c2928a4e68aec81490055c10a42886b09c32558be71e37c360f619066c8",
|
|
63
|
-
"shared/synth_held.h": "c60a42b9716ad56f77844b9d7971dc3fb1d43480467147f7ac46983007681115",
|
|
64
|
-
"shared/synth_hrtf_data.h": "da3c08282e8078791856b6cc6c4fd5ecc314fc81c82d7bb9764d65a938913a3d",
|
|
65
|
-
"shared/synth_modulation.h": "dbbd9804e2d7f3530b6880ee8448a9801b401b716f27399fe7894d71d5421d9e",
|
|
66
|
-
"shared/synth_retrigger.h": "c13ad5179d7cb8e5f43def69e41e9d961805a6f34ad1b0adea1c23bd64acc547",
|
|
67
|
-
"shared/synth_sequence.h": "45c702d8f0fe9a586e4b105a3d25bdb2c75b9d81551a78edad3b13e7bf2c6a5c",
|
|
68
|
-
"shared/synth_spatial.h": "ba7eb24b4d4b05281d15af72fc4b100185ead954be05e4eacd082af213b3de7b",
|
|
69
|
-
"shared/synth_stats.h": "32e6d2a7ed2e1eb410bbcb07bfc300be8e99783169b62ecf1223fa4e47750e27",
|
|
70
|
-
"shared/synth_transport.h": "290844366ba75fee4d134d297f8cea809b44d2ab68694d415988fe3f22f189e4"
|
|
71
|
-
},
|
|
72
|
-
"aggregateSha256": "86f0b22f6f1676bd4fb1ce40cffa9e372dac71f05922febd473a18ed7335494f"
|
|
73
|
-
},
|
|
74
|
-
"sourceUnchangedDuringBuild": true,
|
|
75
|
-
"libraries": [
|
|
76
|
-
{
|
|
77
|
-
"path": "ti.synthengine.xcframework/ios-arm64/libti.synthengine.a",
|
|
78
|
-
"bytes": 302200,
|
|
79
|
-
"sha256": "e1fd2bd257a3d4541e1bed757b42e0d35498e916d93e0c4d77719373cc234263"
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
"path": "ti.synthengine.xcframework/ios-arm64_x86_64-maccatalyst/libti.synthengine.a",
|
|
83
|
-
"bytes": 612416,
|
|
84
|
-
"sha256": "f3ec14d634b21d6471962ce7c5d4c6a1724434c84bc2a60884e595439b990124"
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
"path": "ti.synthengine.xcframework/ios-arm64_x86_64-simulator/libti.synthengine.a",
|
|
88
|
-
"bytes": 604368,
|
|
89
|
-
"sha256": "43c6f95dbb9545302578987df6ab4e46c2598673bd18baa959e7d856c7ce0b32"
|
|
90
|
-
}
|
|
91
|
-
]
|
|
92
|
-
}
|
|
93
|
-
},
|
|
94
|
-
"verification": {
|
|
95
|
-
"publicContractMethods": 19,
|
|
96
|
-
"nativeContractPlatforms": [
|
|
97
|
-
"Android Java",
|
|
98
|
-
"iOS Foundation"
|
|
99
|
-
],
|
|
100
|
-
"toneChordHeldCorpusCases": 118,
|
|
101
|
-
"studioCorpusCases": 109,
|
|
102
|
-
"documentationNativeScoreRecipes": 8,
|
|
103
|
-
"sharedRatesHz": [
|
|
104
|
-
16000,
|
|
105
|
-
44100,
|
|
106
|
-
48000,
|
|
107
|
-
96000,
|
|
108
|
-
192000
|
|
109
|
-
],
|
|
110
|
-
"clock": {
|
|
111
|
-
"simulatedMinutes": 10,
|
|
112
|
-
"sequences": 4,
|
|
113
|
-
"ratesTested": 5,
|
|
114
|
-
"maximumErrorSamples": 1,
|
|
115
|
-
"tempoChanges": true,
|
|
116
|
-
"swing": true,
|
|
117
|
-
"millisecondClock": true
|
|
118
|
-
},
|
|
119
|
-
"concurrency": {
|
|
120
|
-
"transportCyclesUnderThreadSanitizer": 1000,
|
|
121
|
-
"androidOnOffGenerationHandoffs": 10000
|
|
122
|
-
},
|
|
123
|
-
"render": {
|
|
124
|
-
"referenceScenarios": 9,
|
|
125
|
-
"rateWaveCases": 30,
|
|
126
|
-
"bitExact": true,
|
|
127
|
-
"effectsEpochOptimizationFiveRatesBitExact": true
|
|
128
|
-
},
|
|
129
|
-
"regressions": "Shared DSP/sequence/transport/routing/spatial, native engine, API/defaults, contracts, ownership and consumer audio checks passed; independent review findings corrected.",
|
|
130
|
-
"hostBypassScreen": "Latest-source four-case recheck: three cases within screening limits; warmed oneVoice stereo remains +3.49% total and +1.73%p95. Follow-up layout investigation did not correct the total threshold. This host screen remains open; all trials are retained.",
|
|
131
|
-
"physicalSummary": "iPad600-second renderer p95 within limit/zero measured deadline misses. Android extreme-load callback criterion failed. Frontier presentations measured on both devices; Android backend xruns and subsequent headphone distortion reported. iPad Sim80 remains perceptually clean."
|
|
132
|
-
},
|
|
133
|
-
"consumers": [
|
|
134
|
-
{
|
|
135
|
-
"name": "TiSynth-Studio",
|
|
136
|
-
"changes": [
|
|
137
|
-
"start and global tempo",
|
|
138
|
-
"identified native sequence ownership and completion",
|
|
139
|
-
"saved instruments/favorites/A/B/steps preserved",
|
|
140
|
-
"continuous held noise, low-pass bypass and compatible spatial/pan edits",
|
|
141
|
-
"latest complete sequence coalesces while previous ID retires; cancellation clears pending publication"
|
|
142
|
-
],
|
|
143
|
-
"validation": [
|
|
144
|
-
"audio14/14",
|
|
145
|
-
"sequencer7/7",
|
|
146
|
-
"saved-state/index1/1",
|
|
147
|
-
"persisted migration3/3",
|
|
148
|
-
"scoped lint passed"
|
|
149
|
-
]
|
|
150
|
-
},
|
|
151
|
-
{
|
|
152
|
-
"name": "titanium-frontier",
|
|
153
|
-
"changes": [
|
|
154
|
-
"four native sequence slots",
|
|
155
|
-
"separate fanfare/extra-life ownership",
|
|
156
|
-
"selective music processing while combat and propulsion stay dry",
|
|
157
|
-
"held propulsion with continuous noise/cutoff/position edits",
|
|
158
|
-
"removed timer-jingle and granular-motor compatibility implementations",
|
|
159
|
-
"opt-in isolated transport diagnostic",
|
|
160
|
-
"coalesced complete replacement waits for native sequenceend before slot reuse"
|
|
161
|
-
],
|
|
162
|
-
"validation": [
|
|
163
|
-
"aggregate79/80; sole duplicate rejection-log failure corrected; affected regression1/1",
|
|
164
|
-
"all80 audio cases passing across aggregate and focused correction",
|
|
165
|
-
"scoped source/test lint passed"
|
|
166
|
-
]
|
|
167
|
-
},
|
|
168
|
-
{
|
|
169
|
-
"name": "titanium-guardian",
|
|
170
|
-
"changes": [
|
|
171
|
-
"start32voices/4slots",
|
|
172
|
-
"effect sequences compiled to ms with explicit release onset and IDs",
|
|
173
|
-
"completion listeners and shutdown cleanup",
|
|
174
|
-
"native sustained motor only; rejected publication/edit reports false without granular fallback",
|
|
175
|
-
"latest complete sequence coalesces while previous ID retires; cancellation clears pending publication"
|
|
176
|
-
],
|
|
177
|
-
"validation": [
|
|
178
|
-
"audio-system34/34",
|
|
179
|
-
"targeted source/test lint"
|
|
180
|
-
]
|
|
181
|
-
},
|
|
182
|
-
{
|
|
183
|
-
"name": "synthEngineTest",
|
|
184
|
-
"changes": [
|
|
185
|
-
"start/playSequence boundary",
|
|
186
|
-
"retro scores compile native ms payloads",
|
|
187
|
-
"preserved existing sound and app changes",
|
|
188
|
-
"latest complete sequence coalesces while previous ID retires; cancellation clears pending publication"
|
|
189
|
-
],
|
|
190
|
-
"validation": [
|
|
191
|
-
"synth_safe_regression passed",
|
|
192
|
-
"retro_1_1_regression passed",
|
|
193
|
-
"targeted source/test lint"
|
|
194
|
-
]
|
|
195
|
-
},
|
|
196
|
-
{
|
|
197
|
-
"name": "Ti-Synthetizer-App",
|
|
198
|
-
"changes": [
|
|
199
|
-
"closed final native sequence dictionaries",
|
|
200
|
-
"native sequence ID ownership and sequenceend lifecycle",
|
|
201
|
-
"old saved sequence-key migration preserves user identity/name/sound",
|
|
202
|
-
"separate application score compiler, no JS note scheduler",
|
|
203
|
-
"latest complete sequence coalesces while previous ID retires; cancellation clears pending publication"
|
|
204
|
-
],
|
|
205
|
-
"validation": [
|
|
206
|
-
"boundary21/21",
|
|
207
|
-
"focused sequence UI4/4",
|
|
208
|
-
"targeted source/test lint"
|
|
209
|
-
]
|
|
210
|
-
},
|
|
211
|
-
{
|
|
212
|
-
"name": "BinauralLab",
|
|
213
|
-
"changes": [
|
|
214
|
-
"start",
|
|
215
|
-
"native looping nine-position ms sequence; polling paints only",
|
|
216
|
-
"identified cancellation",
|
|
217
|
-
"latest complete sequence coalesces while previous ID retires; cancellation clears pending publication"
|
|
218
|
-
],
|
|
219
|
-
"validation": [
|
|
220
|
-
"syntax and core-rule lint"
|
|
221
|
-
]
|
|
222
|
-
},
|
|
223
|
-
{
|
|
224
|
-
"name": "Simon Game",
|
|
225
|
-
"changes": [
|
|
226
|
-
"start method and test doubles; existing edits preserved"
|
|
227
|
-
],
|
|
228
|
-
"validation": [
|
|
229
|
-
"simon_audio_profile_regression passed",
|
|
230
|
-
"game_logic_regression passed",
|
|
231
|
-
"targeted source/test lint"
|
|
232
|
-
]
|
|
233
|
-
},
|
|
234
|
-
{
|
|
235
|
-
"name": "sound-engine-test",
|
|
236
|
-
"changes": [
|
|
237
|
-
"start method"
|
|
238
|
-
],
|
|
239
|
-
"validation": [
|
|
240
|
-
"syntax and core-rule lint"
|
|
241
|
-
]
|
|
242
|
-
}
|
|
243
|
-
],
|
|
244
|
-
"example": {
|
|
245
|
-
"validation": [
|
|
246
|
-
"example application8/8",
|
|
247
|
-
"sequence owner5/5",
|
|
248
|
-
"real Android Java deferred payload corpus1/1",
|
|
249
|
-
"real iOS deferred payload corpus1/1",
|
|
250
|
-
"scoped static lint passed"
|
|
251
|
-
],
|
|
252
|
-
"contract": "Partial pending voice edits merge; complete scores replace obsolete source/filter fields; publication waits matching retirement event."
|
|
253
|
-
},
|
|
254
|
-
"hostLoad": {
|
|
255
|
-
"kind": "syntheticAndroidCallback",
|
|
256
|
-
"sampleRate": 48000,
|
|
257
|
-
"blockFrames": 256,
|
|
258
|
-
"simulatedSeconds": 30,
|
|
259
|
-
"blocks": 5625,
|
|
260
|
-
"voices": 32,
|
|
261
|
-
"sequences": 4,
|
|
262
|
-
"binaural": true,
|
|
263
|
-
"lfosPerVoice": 2,
|
|
264
|
-
"effects": true,
|
|
265
|
-
"loadMedian": 0.197421938,
|
|
266
|
-
"loadP95": 0.321257813,
|
|
267
|
-
"loadMax": 1.08478913,
|
|
268
|
-
"deadlineMisses": 1,
|
|
269
|
-
"nativeBytes192k": 24649584,
|
|
270
|
-
"physicalAcceptance": false
|
|
271
|
-
},
|
|
272
|
-
"memoryScope": "Counted native engine, command queue, four triple-bank sequence slots, renderer voices/tails, effects and limiter buffers at 192kHz. Excludes managed/bridge/driver/process peak allocations and does not establish the complete recovery-peak acceptance bound.",
|
|
273
|
-
"performanceReport": "unified-bypass-performance.json",
|
|
274
|
-
"pendingAcceptance": [
|
|
275
|
-
"Android maximum-load callback criterion failed; controlled ten-minute run not started",
|
|
276
|
-
"Latest-source oneVoice host bypass total-time screen remains above2% after investigation",
|
|
277
|
-
"Complete192k physical process/bridge/recovery memory bound not established",
|
|
278
|
-
"Android simulation20 renderer elapsed-work +6.91% investigation remains unresolved",
|
|
279
|
-
"Strict simulation80 equivalent-load coverage inconclusive on both devices; presentation/FPS limits met for matched Arcade/simulation20",
|
|
280
|
-
"Remaining listening cases beyond scoped manual Sim80; iPad and corrected Android short Sim80 accepted by Cesar; other listening cases remain separate"
|
|
281
|
-
],
|
|
282
|
-
"scope": {
|
|
283
|
-
"initialHostValidation": {
|
|
284
|
-
"devicesAccessed": false,
|
|
285
|
-
"consumerApplicationsBuilt": false,
|
|
286
|
-
"commitsMade": false,
|
|
287
|
-
"pushOrReleases": false
|
|
288
|
-
},
|
|
289
|
-
"currentExecution": {
|
|
290
|
-
"devicesAccessed": true,
|
|
291
|
-
"nativeModulesBuilt": [
|
|
292
|
-
"android-four-abis",
|
|
293
|
-
"ios-device-simulator-catalyst"
|
|
294
|
-
],
|
|
295
|
-
"isolatedFrontierAppsBuilt": [
|
|
296
|
-
"android",
|
|
297
|
-
"ios"
|
|
298
|
-
],
|
|
299
|
-
"allEightConsumerApplicationsBuilt": false,
|
|
300
|
-
"commitsMade": true,
|
|
301
|
-
"pushOrReleases": false
|
|
302
|
-
},
|
|
303
|
-
"interpretation": "Initial host-only scope is preserved as history. Physical reports and later delivery work have their own recorded scope; no complete multiplatform acceptance is claimed."
|
|
304
|
-
},
|
|
305
|
-
"nativeSourceCommit": "87b2c3354f182c5742cba84775b075552c80572c",
|
|
306
|
-
"physicalReport": "physical-validation.json",
|
|
307
|
-
"latestNativeMemoryAccounting": {
|
|
308
|
-
"androidRendererHostBytes192k": 24649840,
|
|
309
|
-
"nativeSourceCommit": "87b2c3354f182c5742cba84775b075552c80572c",
|
|
310
|
-
"physicalProcessAcceptance": false,
|
|
311
|
-
"scope": "Current sizeof/capacity accounting, not full process/bridge/allocator/driver peak; one-second host render only sanity-checks finite bounded samples and32activevoices."
|
|
312
|
-
},
|
|
313
|
-
"androidSim80Correction": "android-sim80-correction.json"
|
|
314
|
-
}
|
|
@@ -1,288 +0,0 @@
|
|
|
1
|
-
# Accessibility (a11y) deep dive
|
|
2
|
-
|
|
3
|
-
## 1. Overview
|
|
4
|
-
|
|
5
|
-
Accessibility makes your app usable for people with visual, hearing, and motor disabilities. Titanium works with Android TalkBack and iOS VoiceOver for spoken feedback.
|
|
6
|
-
|
|
7
|
-
### Design considerations beyond screen readers
|
|
8
|
-
|
|
9
|
-
- Motor disabilities often require larger tap targets (minimum 44x44 points on iOS, 48x48 dp on Android). Support alternative input methods and avoid gestures that demand precision or fast timing.
|
|
10
|
-
- Color-blindness means color alone cannot carry meaning. Use text labels, icons, or patterns alongside color indicators. Test the UI in grayscale to check usability.
|
|
11
|
-
- Screen magnifiers are common for low-vision users (iOS Zoom, Android Magnification). Keep layouts functional when magnified and avoid absolute positioning that breaks at large zoom levels.
|
|
12
|
-
|
|
13
|
-
## 2. Core accessibility properties
|
|
14
|
-
|
|
15
|
-
All Titanium view elements support these accessibility properties.
|
|
16
|
-
|
|
17
|
-
| Property | Default Value | Description |
|
|
18
|
-
| --------------------- | ----------------------------- | ------------------------------------------------------------------------------- |
|
|
19
|
-
| `accessibilityHidden` | `false` | If `true`, the view is ignored by the accessibility service |
|
|
20
|
-
| `accessibilityLabel` | Title or label of the control | Succinct label identifying the view |
|
|
21
|
-
| `accessibilityHint` | - | Briefly describes what performing an action will do (e.g., "Closes the window") |
|
|
22
|
-
| `accessibilityValue` | State or value of the control | String describing current state (e.g., "Selected", "50 percent") |
|
|
23
|
-
|
|
24
|
-
> Android note: On Android, `accessibilityLabel`, `accessibilityValue`, and `accessibilityHint` are combined (in that order) and mapped to the native `contentDescription`. TalkBack reads them as one string. VoiceOver on iOS reads them as separate announcements.
|
|
25
|
-
|
|
26
|
-
### Basic usage
|
|
27
|
-
|
|
28
|
-
```javascript
|
|
29
|
-
const button = Ti.UI.createButton({
|
|
30
|
-
title: 'Save',
|
|
31
|
-
accessibilityLabel: 'Save changes',
|
|
32
|
-
accessibilityHint: 'Saves your modifications to the server'
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
const slider = Ti.UI.createSlider({
|
|
36
|
-
min: 0,
|
|
37
|
-
max: 100,
|
|
38
|
-
value: 50,
|
|
39
|
-
accessibilityLabel: 'Volume control',
|
|
40
|
-
accessibilityValue: '50 percent'
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
// Update accessibilityValue as slider changes
|
|
44
|
-
slider.addEventListener('change', (e) => {
|
|
45
|
-
slider.accessibilityValue = `${e.value.toFixed(0)} percent`;
|
|
46
|
-
});
|
|
47
|
-
```
|
|
48
|
-
...
|
|
49
|
-
### Android TalkBack
|
|
50
|
-
...
|
|
51
|
-
```javascript
|
|
52
|
-
// GOOD - Button uses default text
|
|
53
|
-
const button = Ti.UI.createButton({
|
|
54
|
-
title: 'Submit Form'
|
|
55
|
-
// accessibilityLabel NOT needed - title is spoken
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
// CUSTOM - Override default
|
|
59
|
-
const button = Ti.UI.createButton({
|
|
60
|
-
title: 'Submit',
|
|
61
|
-
accessibilityLabel: 'Submit the registration form'
|
|
62
|
-
});
|
|
63
|
-
```
|
|
64
|
-
...
|
|
65
|
-
```javascript
|
|
66
|
-
// BAD - Container with accessibility properties
|
|
67
|
-
// On iOS, VoiceOver treats the entire container as ONE accessible element,
|
|
68
|
-
// completely blocking access to all children inside it (nameField, emailField, etc.)
|
|
69
|
-
const container = Ti.UI.createView({
|
|
70
|
-
accessibilityLabel: 'Form container', // DON'T DO THIS
|
|
71
|
-
accessibilityHint: 'Contains input fields'
|
|
72
|
-
});
|
|
73
|
-
container.add(nameField);
|
|
74
|
-
container.add(emailField);
|
|
75
|
-
container.add(submitButton);
|
|
76
|
-
|
|
77
|
-
// GOOD - No accessibility on container, children accessible
|
|
78
|
-
const container = Ti.UI.createView({
|
|
79
|
-
// No accessibility properties
|
|
80
|
-
});
|
|
81
|
-
container.add(nameField);
|
|
82
|
-
container.add(emailField);
|
|
83
|
-
container.add(submitButton);
|
|
84
|
-
```
|
|
85
|
-
...
|
|
86
|
-
### Star rating example
|
|
87
|
-
|
|
88
|
-
```javascript
|
|
89
|
-
const starView = Ti.UI.createView({
|
|
90
|
-
width: 200,
|
|
91
|
-
height: 40,
|
|
92
|
-
accessibilityLabel: 'Rating',
|
|
93
|
-
accessibilityValue: '4 out of 5 stars',
|
|
94
|
-
accessibilityHint: 'User rating for this product'
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
// Visual representation (images or drawn stars)
|
|
98
|
-
for (let i = 0; i < 5; i++) {
|
|
99
|
-
const star = Ti.UI.createImageView({
|
|
100
|
-
image: i < 4 ? 'star-filled.png' : 'star-empty.png',
|
|
101
|
-
left: i * 35,
|
|
102
|
-
accessibilityHidden: true // Hide individual stars
|
|
103
|
-
});
|
|
104
|
-
starView.add(star);
|
|
105
|
-
}
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
### Toggle button example
|
|
109
|
-
|
|
110
|
-
```javascript
|
|
111
|
-
let isMuted = false;
|
|
112
|
-
const muteButton = Ti.UI.createButton({
|
|
113
|
-
title: 'Mute',
|
|
114
|
-
accessibilityLabel: 'Mute audio',
|
|
115
|
-
accessibilityValue: 'Off' // Current state
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
muteButton.addEventListener('click', () => {
|
|
119
|
-
isMuted = !isMuted;
|
|
120
|
-
muteButton.title = isMuted ? 'Unmute' : 'Mute';
|
|
121
|
-
muteButton.accessibilityValue = isMuted ? 'On' : 'Off';
|
|
122
|
-
});
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
## 6. System-level accessibility events
|
|
126
|
-
|
|
127
|
-
### Monitor accessibility changes
|
|
128
|
-
|
|
129
|
-
```javascript
|
|
130
|
-
Ti.App.addEventListener('accessibilitychanged', (e) => {
|
|
131
|
-
Ti.API.info(`Accessibility mode changed: ${e.enabled}`);
|
|
132
|
-
// Adjust UI behavior as needed
|
|
133
|
-
if (e.enabled) {
|
|
134
|
-
// Increase touch targets, simplify animations, etc.
|
|
135
|
-
}
|
|
136
|
-
});
|
|
137
|
-
```
|
|
138
|
-
...
|
|
139
|
-
### Code patterns
|
|
140
|
-
|
|
141
|
-
Do:
|
|
142
|
-
```javascript
|
|
143
|
-
// Provide meaningful labels
|
|
144
|
-
const iconButton = Ti.UI.createButton({
|
|
145
|
-
image: 'settings.png',
|
|
146
|
-
accessibilityLabel: 'Open settings'
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
// Update state changes
|
|
150
|
-
checkbox.accessibilityValue = isChecked ? 'Checked' : 'Unchecked';
|
|
151
|
-
|
|
152
|
-
// Hide decorative elements
|
|
153
|
-
decorativeIcon.accessibilityHidden = true;
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
Don't:
|
|
157
|
-
```javascript
|
|
158
|
-
// Don't set accessibilityLabel for text controls (Android)
|
|
159
|
-
const label = Ti.UI.createLabel({
|
|
160
|
-
text: 'Hello',
|
|
161
|
-
accessibilityLabel: 'Hello' // REDUNDANT on Android
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
// Don't set accessibility on containers (iOS)
|
|
165
|
-
// VoiceOver treats the container as a single element, making all children unreachable
|
|
166
|
-
const container = Ti.UI.createView({
|
|
167
|
-
accessibilityLabel: 'Container' // BLOCKS children on iOS
|
|
168
|
-
});
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
### Accessibility-first development
|
|
172
|
-
|
|
173
|
-
When designing complex UIs, plan accessibility at the start.
|
|
174
|
-
|
|
175
|
-
```javascript
|
|
176
|
-
function createAccessibleListItem(title, subtitle, action) {
|
|
177
|
-
const item = Ti.UI.createView({
|
|
178
|
-
height: 60,
|
|
179
|
-
accessibilityLabel: title,
|
|
180
|
-
accessibilityHint: `${subtitle}. Double tap to ${action}`
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
const titleLabel = Ti.UI.createLabel({
|
|
184
|
-
text: title,
|
|
185
|
-
accessibilityHidden: true // Already announced by container
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
const subtitleLabel = Ti.UI.createLabel({
|
|
189
|
-
text: subtitle,
|
|
190
|
-
accessibilityHidden: true // Already announced by container
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
item.add(titleLabel);
|
|
194
|
-
item.add(subtitleLabel);
|
|
195
|
-
return item;
|
|
196
|
-
}
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
## 9. Platform behavior comparison
|
|
200
|
-
|
|
201
|
-
TalkBack (Android) and VoiceOver (iOS) interpret accessibility properties differently.
|
|
202
|
-
|
|
203
|
-
| Element | TalkBack Response | VoiceOver Response |
|
|
204
|
-
| -------------------------------- | ------------------------------------------------- | ------------------------------------------------------- |
|
|
205
|
-
| Button with label "Submit" | "Submit, button, double-tap to activate" | "Submit, button" |
|
|
206
|
-
| Slider with value 50% | "50 percent, slider" | "50%, adjustable" |
|
|
207
|
-
| Label with hint | Reads label + value + hint as one combined string | Reads label first, then hint as a separate announcement |
|
|
208
|
-
| Checkbox, checked | "Checked, checkbox, double-tap to toggle" | "Checked, tick box" |
|
|
209
|
-
| Image with label "Profile photo" | "Profile photo" | "Profile photo, image" |
|
|
210
|
-
|
|
211
|
-
> On Android, the three accessibility properties are concatenated into `contentDescription`, so they are read as one utterance. On iOS, VoiceOver reads them as distinct pieces with short pauses between them.
|
|
212
|
-
|
|
213
|
-
## 10. Testing procedures
|
|
214
|
-
|
|
215
|
-
### Android emulator
|
|
216
|
-
|
|
217
|
-
The Android emulator has no built-in way to test accessibility. Use a physical device for accurate TalkBack behavior.
|
|
218
|
-
|
|
219
|
-
### Android device (TalkBack)
|
|
220
|
-
|
|
221
|
-
1. Open **Settings > Accessibility > TalkBack**
|
|
222
|
-
2. Toggle TalkBack **On**
|
|
223
|
-
3. A confirmation dialog appears; confirm to enable
|
|
224
|
-
|
|
225
|
-
TalkBack gestures:
|
|
226
|
-
- Tap: Select and hear the element described
|
|
227
|
-
- Double-tap: Activate the selected element
|
|
228
|
-
- Swipe left/right: Navigate to the previous/next element
|
|
229
|
-
- Swipe up/down: Change reading granularity (characters, words, headings)
|
|
230
|
-
|
|
231
|
-
To disable TalkBack, go to the same setting and toggle it off. You can also set a hardware shortcut (hold both volume keys for 3 seconds) for quick toggling during development.
|
|
232
|
-
|
|
233
|
-
### iOS simulator (Accessibility Inspector)
|
|
234
|
-
|
|
235
|
-
Use the Accessibility Inspector to examine elements without enabling VoiceOver.
|
|
236
|
-
|
|
237
|
-
1. In Xcode, go to **Xcode > Open Developer Tool > Accessibility Inspector**
|
|
238
|
-
2. Select the Simulator as the target device
|
|
239
|
-
3. Hover over or tap elements to inspect their accessibility label, value, hint, and traits
|
|
240
|
-
|
|
241
|
-
This is the fastest way to verify properties during development.
|
|
242
|
-
|
|
243
|
-
### iOS device (VoiceOver)
|
|
244
|
-
|
|
245
|
-
1. Open **Settings > Accessibility > VoiceOver**
|
|
246
|
-
2. Toggle VoiceOver **On**
|
|
247
|
-
|
|
248
|
-
VoiceOver gestures:
|
|
249
|
-
- Tap: Select and hear the element described
|
|
250
|
-
- Double-tap: Activate the selected element
|
|
251
|
-
- Swipe left/right: Navigate to the previous/next element
|
|
252
|
-
- Three-finger swipe: Scroll content
|
|
253
|
-
- Two-finger tap: Pause/resume speech
|
|
254
|
-
|
|
255
|
-
To disable VoiceOver, go to the same setting and toggle it off. You can also configure the Accessibility Shortcut (triple-click the side button) for quick toggling.
|
|
256
|
-
|
|
257
|
-
## 11. External resources
|
|
258
|
-
|
|
259
|
-
- [Accessibility Programming Guide for iOS](https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/iPhoneAccessibility/Introduction/Introduction.html)
|
|
260
|
-
- [Android Accessibility API Guide](http://developer.android.com/guide/topics/ui/accessibility/index.html)
|
|
261
|
-
- [Android Accessibility Design Guide](http://developer.android.com/design/patterns/accessibility.html)
|
|
262
|
-
- [W3C Web Content Accessibility Guidelines](http://www.w3.org/WAI/WCAG20/quickref/)
|
|
263
|
-
|
|
264
|
-
## 12. Common issues
|
|
265
|
-
|
|
266
|
-
### Issue: VoiceOver cannot access children
|
|
267
|
-
|
|
268
|
-
Cause: A container view has accessibility properties set.
|
|
269
|
-
|
|
270
|
-
Solution: Remove all accessibility properties from container views.
|
|
271
|
-
|
|
272
|
-
### Issue: TalkBack does not speak text
|
|
273
|
-
|
|
274
|
-
Cause: `accessibilityLabel` on a Label/Button overrides visible text.
|
|
275
|
-
|
|
276
|
-
Solution: Do not set `accessibilityLabel` on textual controls unless you are intentionally overriding.
|
|
277
|
-
|
|
278
|
-
### Issue: Complex custom controls are not accessible
|
|
279
|
-
|
|
280
|
-
Cause: Custom-drawn views have no accessibility properties.
|
|
281
|
-
|
|
282
|
-
Solution: Provide `accessibilityLabel`, `accessibilityValue`, and `accessibilityHint` for custom controls.
|
|
283
|
-
|
|
284
|
-
### Issue: State changes are not announced
|
|
285
|
-
|
|
286
|
-
Cause: `accessibilityValue` is not updated when state changes.
|
|
287
|
-
|
|
288
|
-
Solution: Update `accessibilityValue` in change event handlers.
|