@maccesar/titools 5.3.0 → 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.
Files changed (98) hide show
  1. package/CONTRIBUTING.md +1 -1
  2. package/README.md +31 -60
  3. package/agents/ti-pro.md +3 -1
  4. package/commands/ti-audit.md +6 -4
  5. package/docs/examples.md +9 -0
  6. package/docs/knowledge-index.md +2 -1
  7. package/lib/config.js +1 -0
  8. package/package.json +1 -1
  9. package/skills/alloy-guides/SKILL.md +18 -179
  10. package/skills/alloy-guides/references/CLI_TASKS.md +17 -216
  11. package/skills/alloy-guides/references/CONCEPTS.md +27 -162
  12. package/skills/alloy-guides/references/CONTROLLERS.md +38 -236
  13. package/skills/alloy-guides/references/MODELS.md +47 -723
  14. package/skills/alloy-guides/references/MODELS_ADVANCED.md +21 -482
  15. package/skills/alloy-guides/references/VIEWS_DYNAMIC.md +12 -222
  16. package/skills/alloy-guides/references/VIEWS_STYLES.md +39 -358
  17. package/skills/alloy-guides/references/VIEWS_XML.md +36 -552
  18. package/skills/alloy-guides/references/WIDGETS.md +49 -127
  19. package/skills/alloy-howtos/SKILL.md +14 -169
  20. package/skills/alloy-howtos/references/best_practices.md +9 -113
  21. package/skills/alloy-howtos/references/cli_reference.md +18 -223
  22. package/skills/alloy-howtos/references/config_files.md +50 -133
  23. package/skills/alloy-howtos/references/debugging_troubleshooting.md +19 -63
  24. package/skills/alloy-howtos/references/samples.md +21 -138
  25. package/skills/ti-api/SKILL.md +10 -2
  26. package/skills/ti-api/references/api-android.md +36 -2
  27. package/skills/ti-api/references/api-app-platform.md +39 -3
  28. package/skills/ti-api/references/api-core.md +50 -18
  29. package/skills/ti-api/references/api-data-network.md +49 -35
  30. package/skills/ti-api/references/api-media.md +45 -27
  31. package/skills/ti-api/references/api-services.md +39 -9
  32. package/skills/ti-api/references/api-ui-android.md +33 -13
  33. package/skills/ti-api/references/api-ui-extras.md +41 -15
  34. package/skills/ti-api/references/api-ui-ios-animator.md +42 -26
  35. package/skills/ti-api/references/api-ui-ios.md +74 -2
  36. package/skills/ti-api/references/api-ui-lists.md +32 -16
  37. package/skills/ti-api/references/api-ui-text-input.md +34 -17
  38. package/skills/ti-api/references/api-ui-views.md +27 -1
  39. package/skills/ti-api/references/api-ui-windows-navigation.md +32 -18
  40. package/skills/ti-api/references/api-xml-global.md +66 -16
  41. package/skills/ti-create-release/SKILL.md +98 -0
  42. package/skills/ti-create-release/references/module-discovery.md +69 -0
  43. package/skills/ti-expert/references/adaptive-layouts.md +1 -1
  44. package/skills/ti-guides/SKILL.md +37 -76
  45. package/skills/ti-guides/references/advanced-data-and-images.md +122 -126
  46. package/skills/ti-guides/references/android-manifest.md +24 -83
  47. package/skills/ti-guides/references/app-distribution.md +31 -377
  48. package/skills/ti-guides/references/application-frameworks.md +127 -335
  49. package/skills/ti-guides/references/cli-reference.md +184 -633
  50. package/skills/ti-guides/references/commonjs-advanced.md +81 -231
  51. package/skills/ti-guides/references/compatibility-matrix.md +36 -75
  52. package/skills/ti-guides/references/hello-world.md +95 -70
  53. package/skills/ti-guides/references/hyperloop-native-access.md +52 -448
  54. package/skills/ti-guides/references/resources.md +174 -142
  55. package/skills/ti-guides/references/sdk-release-notes.md +28 -71
  56. package/skills/ti-guides/references/tiapp-config.md +222 -598
  57. package/skills/ti-howtos/SKILL.md +23 -123
  58. package/skills/ti-howtos/references/cross-platform-development.md +119 -324
  59. package/skills/ti-howtos/references/debugging-profiling.md +77 -445
  60. package/skills/ti-howtos/references/extending-titanium.md +199 -673
  61. package/skills/ti-howtos/references/local-data-sources.md +87 -300
  62. package/skills/ti-howtos/references/location-and-maps.md +86 -213
  63. package/skills/ti-howtos/references/media-apis.md +103 -223
  64. package/skills/ti-howtos/references/notification-services.md +86 -506
  65. package/skills/ti-howtos/references/remote-data-sources.md +97 -316
  66. package/skills/ti-howtos/references/using-modules.md +77 -133
  67. package/skills/ti-ui/SKILL.md +28 -143
  68. package/skills/ti-ui/references/icons-and-splash-screens.md +74 -403
  69. package/skills/ti-ui/references/layouts-and-positioning.md +175 -402
  70. package/skills/ti-ui/references/listviews-and-performance.md +100 -703
  71. package/skills/ti-ui/references/platform-conventions.md +180 -0
  72. package/skills/ti-ui/references/user-interface.md +43 -0
  73. package/skills/alloy-guides/references/VIEWS_WITHOUT_CONTROLLERS.md +0 -102
  74. package/skills/alloy-howtos/references/custom_tags.md +0 -148
  75. package/skills/ti-guides/references/coding-best-practices.md +0 -149
  76. package/skills/ti-guides/references/javascript-primer.md +0 -414
  77. package/skills/ti-guides/references/reserved-words.md +0 -36
  78. package/skills/ti-guides/references/style-and-conventions.md +0 -103
  79. package/skills/ti-howtos/references/android-platform-deep-dives.md +0 -624
  80. package/skills/ti-howtos/references/automation-fastlane-appium.md +0 -96
  81. package/skills/ti-howtos/references/buffer-codec-streams.md +0 -162
  82. package/skills/ti-howtos/references/google-maps-v2.md +0 -172
  83. package/skills/ti-howtos/references/ios-map-kit.md +0 -149
  84. package/skills/ti-howtos/references/ios-platform-deep-dives.md +0 -611
  85. package/skills/ti-howtos/references/tutorials.md +0 -565
  86. package/skills/ti-howtos/references/web-content-integration.md +0 -287
  87. package/skills/ti-howtos/references/webpack-build-pipeline.md +0 -124
  88. package/skills/ti-ui/references/accessibility-deep-dive.md +0 -288
  89. package/skills/ti-ui/references/animation-and-matrices.md +0 -569
  90. package/skills/ti-ui/references/application-structures.md +0 -626
  91. package/skills/ti-ui/references/custom-fonts-styling.md +0 -549
  92. package/skills/ti-ui/references/event-handling.md +0 -401
  93. package/skills/ti-ui/references/gestures.md +0 -448
  94. package/skills/ti-ui/references/orientation.md +0 -374
  95. package/skills/ti-ui/references/platform-ui-android.md +0 -727
  96. package/skills/ti-ui/references/platform-ui-ios.md +0 -576
  97. package/skills/ti-ui/references/scrolling-views.md +0 -288
  98. package/skills/ti-ui/references/tableviews.md +0 -542
@@ -1,268 +1,148 @@
1
- # Media APIs
1
+ # Media
2
2
 
3
- ## 1. Audio APIs
3
+ Based on the [current official guide](https://titaniumsdk.com/docs/build/media.md). Examples target released SDK 13.4.1; verify the selected SDK before adopting version-specific behavior.
4
4
 
5
- ### Playing basic sounds (Ti.Media.Sound)
6
- - Use for short effects, beeps, ambient audio
7
- - The entire file loads into memory. Use `preload=true` to reduce delay.
8
- - Methods: `play()`, `pause()`, `stop()`, `setVolume()`
9
- - `allowBackground=true` keeps playback going when the app closes
5
+ Camera, library access and recording need their matching permissions. Playing an app-owned audio or video file does not itself require camera, microphone or music-library permission.
10
6
 
11
- ```javascript
12
- const sound = Ti.Media.createSound({
13
- url: 'beep.mp3',
14
- preload: true
15
- });
16
- sound.play();
17
- ```
18
-
19
- ### Streaming audio (Ti.Media.AudioPlayer)
20
- - Use for streaming web URLs (MP3, HLS)
21
- - Supports pseudo-streaming and HLS
22
- - Handle interruptions (phone calls) with app-level events:
23
- - `pause`: call `setPaused(true)` or `pause()`
24
- - `resume`: call `setPaused(false)` or `start()`
25
-
26
- ```javascript
27
- const streamer = Ti.Media.createAudioPlayer({ url: 'https://example.com/stream.mp3' });
28
- streamer.start();
29
-
30
- Ti.App.addEventListener('pause', () => { streamer.setPaused(true); });
31
- Ti.App.addEventListener('resume', () => { streamer.setPaused(false); });
32
- ```
33
-
34
- ### Recording audio (Ti.Media.AudioRecorder)
35
- - Requires microphone permission
36
- - Properties:
37
- - `compression`: `Ti.Media.AUDIO_FORMAT_ULAW` (low-fi) or `AUDIO_FORMAT_LINEAR_PCM` (hi-fi)
38
- - `format`: `Ti.Media.AUDIO_FILEFORMAT_WAVE`
39
- - Methods: `start()`, `pause()`/`resume()`, `stop()`
40
-
41
- ## 2. Video APIs (Ti.Media.VideoPlayer)
7
+ ## Ask first
42
8
 
43
- ### Cross-platform considerations
44
- - Android: must be fullscreen (Intent-based, not a view proxy)
45
- - iOS: can be embedded or fullscreen; set `height` and `width` for embedded
9
+ Each capability has a matching pair of methods.
46
10
 
47
- ### Basic usage
48
- - `url`: local file path or remote URL
49
- - `autoplay=true`: auto-start when rendered
50
- - `movieControlStyle`: `Ti.Media.VIDEO_CONTROL_EMBEDDED` for embedded controls
51
- - `scalingMode`: control fill/fit behavior
52
-
53
- ```javascript
54
- const videoPlayer = Ti.Media.createVideoPlayer({
55
- url: 'movie.mp4',
56
- scalingMode: Ti.Media.VIDEO_SCALING_ASPECT_FIT // or ASPECT_FILL, MODE_FILL, NONE
57
- });
58
- ```
59
-
60
- ```javascript
61
- const player = Ti.Media.createVideoPlayer({
62
- url: 'movie.mp4',
63
- movieControlStyle: Ti.Media.VIDEO_CONTROL_EMBEDDED,
64
- autoplay: true
65
- });
66
-
67
- // iOS only: add to window
68
- if (Ti.Platform.osname === 'iphone' || Ti.Platform.osname === 'ipad') {
69
- win.add(player);
70
- }
11
+ | Capability | Check | Ask |
12
+ | ---------- | ----- | --- |
13
+ | Camera | `Ti.Media.hasCameraPermissions()` | `requestCameraPermissions()` |
14
+ | Photo library | `hasPhotoGalleryPermissions()` | `requestPhotoGalleryPermissions()` |
15
+ | Microphone | `hasAudioRecorderPermissions()` | `requestAudioRecorderPermissions()` |
16
+ | Music library (iOS) | `hasMusicLibraryPermissions()` | `requestMusicLibraryPermissions()` |
71
17
 
72
- // Stop when window closes
73
- win.addEventListener('close', () => { player.stop(); });
74
- ```
75
-
76
- ### Key events
77
- - `complete`: playback ended (check `e.reason` vs `Ti.Media.VIDEO_FINISH_REASON_PLAYBACK_ENDED`)
78
- - `load`: movie finished loading
79
- - `fullscreen`: entered/exited fullscreen (check `e.entering`)
80
-
81
- ## 3. Camera and photo gallery APIs
82
-
83
- ### Camera availability and permissions
84
- Always check device support and permissions before opening the camera:
85
-
86
- ```javascript
87
- if (!Ti.Media.isCameraSupported) {
88
- Ti.API.warn('No camera available on this device');
89
- return;
90
- }
91
-
92
- if (Ti.Media.hasCameraPermissions()) {
93
- openCamera();
94
- } else {
18
+ ```js
19
+ function withCamera(done) {
20
+ if (Ti.Media.hasCameraPermissions()) {
21
+ done();
22
+ return;
23
+ }
95
24
  Ti.Media.requestCameraPermissions((e) => {
96
25
  if (e.success) {
97
- openCamera();
26
+ done();
98
27
  } else {
99
- Ti.API.error('Camera permission denied');
28
+ Ti.API.warn('camera denied');
100
29
  }
101
30
  });
102
31
  }
103
32
  ```
104
33
 
105
- Required `tiapp.xml` keys (iOS):
34
+ iOS also needs a usage string in `tiapp.xml`, and a missing required usage description can terminate the app when the protected API is accessed:
106
35
 
107
36
  ```xml
108
- <key>NSCameraUsageDescription</key>
109
- <string>We need camera access to take photos</string>
110
- <key>NSPhotoLibraryUsageDescription</key>
111
- <string>We need photo library access to save photos</string>
37
+ <ios>
38
+ <plist>
39
+ <dict>
40
+ <key>NSCameraUsageDescription</key>
41
+ <string>Attach a photo to a note.</string>
42
+ <key>NSPhotoLibraryUsageDescription</key>
43
+ <string>Choose a photo to attach to a note.</string>
44
+ <key>NSMicrophoneUsageDescription</key>
45
+ <string>Record a voice note.</string>
46
+ </dict>
47
+ </plist>
48
+ </ios>
112
49
  ```
113
50
 
114
- ### Camera (Ti.Media.showCamera)
115
- - Requires camera permission and usage descriptions
116
- - Success callback provides `event.media` (Blob)
117
- - Use `saveToPhotoGallery: true` to auto-save
118
- - Handle `cancel` and `error` callbacks
51
+ Write the real reason. "Required by the app" is the string reviewers reject.
119
52
 
120
- ### Front and rear camera
121
- ```javascript
122
- const cameras = Ti.Media.availableCameras;
53
+ ## The camera
123
54
 
124
- // Check if front camera exists
125
- if (cameras.indexOf(Ti.Media.CAMERA_FRONT) !== -1) {
126
- Ti.Media.showCamera({
127
- whichCamera: Ti.Media.CAMERA_FRONT,
128
- // ... other options
129
- });
130
- }
131
-
132
- // Switch camera programmatically
133
- Ti.Media.switchCamera(Ti.Media.CAMERA_REAR);
55
+ ```js
56
+ Ti.Media.showCamera({
57
+ mediaTypes: [Ti.Media.MEDIA_TYPE_PHOTO],
58
+ saveToPhotoGallery: false,
59
+ success(e) {
60
+ const image = Ti.UI.createImageView({ image: e.media, width: 200, height: 200 });
61
+ win.add(image);
62
+ },
63
+ cancel() {},
64
+ error(e) {
65
+ Ti.API.error(e.error);
66
+ }
67
+ });
134
68
  ```
135
69
 
136
- ### Advanced camera options (iOS)
137
- | Property | Description |
138
- | ---------------------- | ----------------------------------------------- |
139
- | `autohide` | Auto-hide camera after capture (default: true) |
140
- | `animated` | Animate camera appearance |
141
- | `allowEditing` | Allow user to crop/edit after capture |
142
- | `mediaTypes` | Array: `MEDIA_TYPE_PHOTO`, `MEDIA_TYPE_VIDEO` |
143
- | `videoMaximumDuration` | Max video duration in milliseconds |
144
- | `videoQuality` | `QUALITY_HIGH`, `QUALITY_MEDIUM`, `QUALITY_LOW` |
145
- | `overlay` | Custom `Ti.UI.View` overlay on camera |
146
- | `showControls` | Show/hide default camera controls |
70
+ `e.media` is a `Blob`. Assign it straight to an `ImageView`, or write it to a
71
+ file with `Ti.Filesystem`.
147
72
 
148
- When using a custom overlay, call `Ti.Media.takePicture()` to capture and `Ti.Media.hideCamera()` to dismiss.
73
+ `saveToPhotoGallery` defaults to false, so a photo your app took exists only in
74
+ that blob until you save it somewhere. Write it to
75
+ `applicationDataDirectory` if it needs to outlive the screen.
149
76
 
150
- ### Gallery (Ti.Media.openPhotoGallery)
151
- - Success callback provides `event.media` (Blob)
152
- - Note: `event.media` may only contain file info. Use `Ti.Filesystem.getFile(event.media.nativePath)` to access the actual file.
77
+ Close the camera with `Ti.Media.hideCamera()` when you dismiss it yourself.
153
78
 
154
- ### iPad-specific gallery options
155
- On iPad, the photo gallery opens as a popover. Configure its position:
79
+ ## The photo library
156
80
 
157
- ```javascript
81
+ ```js
158
82
  Ti.Media.openPhotoGallery({
159
- popoverView: myButton, // Anchor popover to this view
160
- arrowDirection: Ti.UI.iPad.POPOVER_ARROW_DIRECTION_UP,
161
- success: (e) => { /* ... */ }
162
- });
163
- ```
164
-
165
- ### Memory management
166
- Use `imageAsResized()` on blobs to avoid memory exhaustion. Resize to target dimensions before assigning to an ImageView.
167
-
168
- ```javascript
169
- Ti.Media.showCamera({
170
- success: (event) => {
171
- const blob = event.media.imageAsResized(800, 600);
172
- imageView.image = blob;
83
+ mediaTypes: [Ti.Media.MEDIA_TYPE_PHOTO],
84
+ allowMultiple: false,
85
+ success(e) {
86
+ // Single selection returns a media Blob, whose length is bytes, not item count.
87
+ Ti.API.info('Picked one item');
173
88
  },
174
- cancel: () => { Ti.API.info('Camera canceled'); },
175
- error: (e) => { Ti.API.error(`Camera error: ${e.error}`); }
89
+ cancel() {}
176
90
  });
177
91
  ```
178
92
 
179
- ## 4. Images and ImageView APIs
93
+ With `allowMultiple: true` the success event carries an `images` array instead
94
+ of a single `media`, which is the shape change to handle rather than assume.
180
95
 
181
- ### Background images
182
- - Scaled to fit component dimensions by default
183
- - iOS: use `backgroundLeftCap` and `backgroundTopCap` to control stretch regions
184
- - Android: supports remote URLs as background images; iOS does not
96
+ ## Audio
185
97
 
186
- ### Image stretching (background images)
187
- When using small images as backgrounds, iOS and Android stretch differently:
188
- - `backgroundLeftCap` (iOS): pixels from the left that are not stretched. The middle section stretches.
189
- - `backgroundTopCap` (iOS): pixels from the top that are not stretched.
190
- - Android: supports remote URLs for background images; iOS does not.
98
+ Three objects, for three jobs.
191
99
 
192
- ### ImageView component
193
- - `image` accepts: URL, local path, or `Ti.Filesystem.File`
194
- - Scaling behavior:
195
- - Both `height` and `width` specified: unproportional scale (aspect ratio not maintained)
196
- - Only one dimension specified: proportional scale (aspect ratio maintained)
197
- - `defaultImage`: local image to show while remote image loads
100
+ | Object | For |
101
+ | ------ | --- |
102
+ | `Ti.Media.Sound` | Short effects, held in memory |
103
+ | `Ti.Media.AudioPlayer` | Long files and streams |
104
+ | `Ti.Media.AudioRecorder` | Recording |
198
105
 
199
- ### Density-specific images
200
-
201
- Android: place in resolution-specific directories:
202
- - `res-ldpi`, `res-mdpi`, `res-hdpi`, `res-xhdpi`, `res-xxhdpi`, `res-xxxhdpi`
106
+ ```js
107
+ const sound = Ti.Media.createSound({ url: '/audio/tap.wav' });
108
+ sound.play();
203
109
 
204
- iOS: use naming convention:
205
- - `foo.png` - non-retina
206
- - `foo@2x.png` - retina
207
- - `foo@3x.png` - iPhone 6 Plus
208
- - `foo~iphone.png` - iPhone-specific
209
- - `foo~ipad.png` - iPad-specific
110
+ const player = Ti.Media.createAudioPlayer({ url: 'https://example.com/talk.mp3' });
111
+ player.addEventListener('change', (e) => Ti.API.info(e.description));
112
+ player.start();
113
+ ```
210
114
 
211
- For remote density-specific images on iOS:
115
+ `Sound` loads the whole file, so it is for something short. `AudioPlayer`
116
+ buffers, which is what you want for anything longer than a notification chime.
212
117
 
213
- ```javascript
214
- const density = Ti.Platform.displayCaps.logicalDensityFactor;
215
- const url = `https://example.com/image@${density}x.png`;
216
- const imageView = Ti.UI.createImageView({
217
- image: url,
218
- hires: true // Indicates high-resolution remote image
219
- });
220
- ```
118
+ For audio that continues when the app is backgrounded, set
119
+ `Ti.Media.audioSessionCategory` and declare background audio in `tiapp.xml`.
120
+ On iOS configure both for background audio; these settings do not keep playback alive after process termination.
221
121
 
222
- ### Flipbook animations
223
- - Assign an array of images to `images`
224
- - `duration`: milliseconds between frames
225
- - `repeatCount`: 0 = infinite, >1 = specific count
122
+ ## Video
226
123
 
227
- ```javascript
228
- const frames = [];
229
- for (let i = 1; i < 18; i++) {
230
- frames.push(`frame${i}.png`);
231
- }
232
- const animationView = Ti.UI.createImageView({
233
- images: frames,
234
- duration: 100,
235
- repeatCount: 0
124
+ ```js
125
+ const video = Ti.Media.createVideoPlayer({
126
+ url: 'https://example.com/clip.mp4',
127
+ width: Ti.UI.FILL,
128
+ height: 240,
129
+ autoplay: true
130
+ });
131
+ win.add(video);
132
+ win.addEventListener('close', () => {
133
+ video.stop();
134
+ video.release();
236
135
  });
237
- // animationView.stop() / animationView.start() to control
238
136
  ```
239
137
 
240
- ## Permissions checklist
138
+ A `VideoPlayer` is a view, so it lays out like any other and defaults to
139
+ filling its parent. Release it when the window closes: it holds a decoder, and
140
+ leaving it alive costs memory that the platform will eventually take back by
141
+ killing the app.
241
142
 
242
- ### iOS (tiapp.xml)
243
- ```xml
244
- <ios>
245
- <plist>
246
- <dict>
247
- <key>NSCameraUsageDescription</key>
248
- <string>Need camera to take photos</string>
249
- <key>NSPhotoLibraryUsageDescription</key>
250
- <string>Need photo library access</string>
251
- <key>NSMicrophoneUsageDescription</key>
252
- <string>Need microphone for audio recording</string>
253
- </dict>
254
- </plist>
255
- </ios>
256
- ```
143
+ ## Next
257
144
 
258
- ### Android (tiapp.xml)
259
- ```xml
260
- <android>
261
- <manifest>
262
- <uses-permission android:name="android.permission.CAMERA"/>
263
- <uses-permission android:name="android.permission.RECORD_AUDIO"/>
264
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
265
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
266
- </manifest>
267
- </android>
268
- ```
145
+ [Location and maps](https://titaniumsdk.com/docs/build/location.md) covers the other capability that
146
+ needs asking first.
147
+
148
+ Contract corrections: [released Media API](https://github.com/tidev/titanium-sdk/blob/13_4_1_GA/apidoc/Titanium/Media/Media.yml), [VideoPlayer](https://github.com/tidev/titanium-sdk/blob/13_4_1_GA/apidoc/Titanium/Media/VideoPlayer.yml).