diff --git a/CHANGELOG.md b/CHANGELOG.md index c5759037ef9..4e51dd3dc38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,137 @@ +## [12.6.1](https://github.com/tidev/titanium_mobile/compare/12_6_0_GA...12.6.1) (2024-12-19) + +## About this release + +Titanium SDK 12.6.1 is a patch release of the SDK, addressing a regression related to click events on iOS from 12.6.0. + +## Community Credits + +* Michael Gangolf + * ios workflow update ([94d9cac](https://github.com/tidev/titanium_mobile/commit/94d9cace7c98d8b670e20bd0f56ac0fe839b86da)) + +* Hans Knöchel + * Revert "fix(android): ios click speed (#14115)" (#14153) ([53227e4](https://github.com/tidev/titanium_mobile/commit/53227e41b2855dcc5008b43fecd0c4720d22c073)) + * bump version ([82d9471](https://github.com/tidev/titanium_mobile/commit/82d9471170bb6f19526d94d87353e9d8b689e081)) + +## SDK Module Versions + +| Module | Android version | iOS Version | +| ----------- | --------------- | ----------- | +| facebook | 13.0.0 | 15.0.0 | +| ti.map | 5.6.1 | 7.3.1 | +| ti.webdialog | 2.3.0 | 3.0.2 | +| ti.playservices | 18.3.0 | n/a | +| ti.identity | 3.1.0 | 5.0.0 | +| urlSession | n/a | 4.0.1 | +| ti.coremotion | n/a | 4.0.1 | +| ti.applesignin | n/a | 3.1.2 | +| hyperloop | 7.0.9 | 7.0.9 | + +# [12.6.0](https://github.com/tidev/titanium_mobile/compare/12_5_X...12.6.0) (2024-12-12) + +## About this release + +Titanium SDK 12.6.0 is a minor release of the SDK, adding new features and addressing potential bugs from previous releases. + +## Community Credits + +* Prashant Saini + * added new methods in Ti.Calendar.Calendar module for bulk operations ([25fb9fd](https://github.com/tidev/titanium_mobile/commit/25fb9fd00a1976f3fd2aada0aa11ecac16e5c832)) + +* Michael Gangolf + * set default exitOnClose property to true ([929aeea](https://github.com/tidev/titanium_mobile/commit/929aeea5127e69462cde5bf3ce4383594838d3a3)) + * update node-titanium-sdk ([5c25ec1](https://github.com/tidev/titanium_mobile/commit/5c25ec197b929c341b1c51a0429c87454ebb9c75)) + * optimize cameraX rotation after camera is active ([69b645f](https://github.com/tidev/titanium_mobile/commit/69b645f185d860b4371ae5c912fd2b36e55bbfda)) + * tableView row parent ([6fc9dcb](https://github.com/tidev/titanium_mobile/commit/6fc9dcbb40d0c1c739af5d9a2b5fe2088f7398fd)) + * findStateDrawableIndex reflection method ([4364a7c](https://github.com/tidev/titanium_mobile/commit/4364a7c1c6b8b826ceb5e2bb0f35648e88e4b2de)) + * fix starting activity when launching from home screen ([c69e2ec](https://github.com/tidev/titanium_mobile/commit/c69e2ecfcd5594fd9a6e137b25537d6501084044)) + * webview content will fill up the whole Ti.UI.WebView by default ([c817069](https://github.com/tidev/titanium_mobile/commit/c817069cbfc3de352e7fa0d7b93dea45294a7c6e)) + * fix Material3 BottomNavigation height ([d83d64e](https://github.com/tidev/titanium_mobile/commit/d83d64ef4573d5301337d813c6f104b95566f888)) + * add x/y to ScrollView drag events ([70073c4](https://github.com/tidev/titanium_mobile/commit/70073c425c72d7e3a62ed2bb749c896b0cff832b)) + * enable gradle config caching ([6f0d755](https://github.com/tidev/titanium_mobile/commit/6f0d755e05a01d5abbc66d5610af5f6fdfdceaf8)) + * add direction to ListView scrolling ([81d5d1e](https://github.com/tidev/titanium_mobile/commit/81d5d1e79b13f6677041256e7416f72662c2f2dc)) + * build module with example app ([b8d1a8f](https://github.com/tidev/titanium_mobile/commit/b8d1a8fe6a8a7b6c4d2209f2873f4a3eb0c52981)) + * update NotificationChannel example ([cd0b55f](https://github.com/tidev/titanium_mobile/commit/cd0b55fd4a7263b96f31918f229cf3f1b6de0aa0)) + * update gradle files ([f3676e1](https://github.com/tidev/titanium_mobile/commit/f3676e19e1eacadba532010f511f6123efc0f244)) + * add responseDictionary to HTTPClient documentation ([d98f6a6](https://github.com/tidev/titanium_mobile/commit/d98f6a6fbf5d6406ceb20492ba89410400b6a95c)) + +* Hans Knöchel + * add 12.6.0 changelog ([4fcd806](https://github.com/tidev/titanium_mobile/commit/4fcd806bc23fc37b66962ed046b60c040cc4f796)) + * fix line ([2e85703](https://github.com/tidev/titanium_mobile/commit/2e857038e3f0ad620bf3f3b0bfd23bab2ec5100d)) + * update hyperloop to 7.0.9 to fix dex issues ([829d4ab](https://github.com/tidev/titanium_mobile/commit/829d4ab2b481e5cb4e5ee399ab8cad419267c21d)) + * update ti.facebook to latest ([5aec767](https://github.com/tidev/titanium_mobile/commit/5aec767eb550e95a2ae86395e6bdfdb661f5e661)) + * update hyperloop to 7.0.8 to support SDK 12.6.0+ ([c5f2132](https://github.com/tidev/titanium_mobile/commit/c5f2132e87d2eca048e2c866ed9e8f2457d7994a)) + * update hyperloop to 7.0.7 ([d084485](https://github.com/tidev/titanium_mobile/commit/d084485ed0bd0c0bfcc84154ad543be4ccdd59cf)) + * bump master to 12.6.0 ([5b274a7](https://github.com/tidev/titanium_mobile/commit/5b274a769b10fc3f25d2c746d6ec24aec6b5e014)) + +* dlewis23 + * iOS 18 dark mode icons (#14138) ([8f201d9](https://github.com/tidev/titanium_mobile/commit/8f201d94bd13dc3a7c67ce850d11c828d2ca12e7)) + +* Abdullah Al-Faqeir + * override user interface style ([5bebfdb](https://github.com/tidev/titanium_mobile/commit/5bebfdb97f59e3cb76a7eb82d6d940762563b6ab)) + * fixing not finding themes when building sdk app.js ([5dd0259](https://github.com/tidev/titanium_mobile/commit/5dd0259b7a2310f92f45f78e52913437d93b4677)) + * be able to add plugins to build.gradle ([e1212e9](https://github.com/tidev/titanium_mobile/commit/e1212e9fccd79f5c302a8380157288df356081da)) + * gradle 8 ([50d8604](https://github.com/tidev/titanium_mobile/commit/50d8604ea40b4c2aacb55ee1128a2706f421715c)) + * ios click speed ([6cc8830](https://github.com/tidev/titanium_mobile/commit/6cc8830f874474a176cc181390e4d3c18f7b8b38)) + +* Douglas Alves + * handle x/y position for touch in dragstart/dragend events on iOS ([62e9d4a](https://github.com/tidev/titanium_mobile/commit/62e9d4abfdaf893b854465b8d0766fa662ca6f35)) + + +## Bug Fixes + +### Android platform + +* build module with example app ([b8d1a8f](https://github.com/tidev/titanium_mobile/commit/b8d1a8fe6a8a7b6c4d2209f2873f4a3eb0c52981)) +* findStateDrawableIndex reflection method ([4364a7c](https://github.com/tidev/titanium_mobile/commit/4364a7c1c6b8b826ceb5e2bb0f35648e88e4b2de)) +* fix Material3 BottomNavigation height ([d83d64e](https://github.com/tidev/titanium_mobile/commit/d83d64ef4573d5301337d813c6f104b95566f888)) +* fix starting activity when launching from home screen ([c69e2ec](https://github.com/tidev/titanium_mobile/commit/c69e2ecfcd5594fd9a6e137b25537d6501084044)) +* fixing not finding themes when building sdk app.js ([5dd0259](https://github.com/tidev/titanium_mobile/commit/5dd0259b7a2310f92f45f78e52913437d93b4677)) +* ios click speed ([6cc8830](https://github.com/tidev/titanium_mobile/commit/6cc8830f874474a176cc181390e4d3c18f7b8b38)) +* optimize cameraX rotation after camera is active ([69b645f](https://github.com/tidev/titanium_mobile/commit/69b645f185d860b4371ae5c912fd2b36e55bbfda)) +* override user interface style ([5bebfdb](https://github.com/tidev/titanium_mobile/commit/5bebfdb97f59e3cb76a7eb82d6d940762563b6ab)) +* set default exitOnClose property to true ([929aeea](https://github.com/tidev/titanium_mobile/commit/929aeea5127e69462cde5bf3ce4383594838d3a3)) +* tableView row parent ([6fc9dcb](https://github.com/tidev/titanium_mobile/commit/6fc9dcbb40d0c1c739af5d9a2b5fe2088f7398fd)) + +### Multiple platforms + +* handle x/y position for touch in dragstart/dragend events on iOS ([62e9d4a](https://github.com/tidev/titanium_mobile/commit/62e9d4abfdaf893b854465b8d0766fa662ca6f35)) + +## Features + +### Multiple platforms + +* update ti.facebook to latest ([5aec767](https://github.com/tidev/titanium_mobile/commit/5aec767eb550e95a2ae86395e6bdfdb661f5e661)) +* update hyperloop to 7.0.7 ([d084485](https://github.com/tidev/titanium_mobile/commit/d084485ed0bd0c0bfcc84154ad543be4ccdd59cf)) +* update hyperloop to 7.0.8 to support SDK 12.6.0+ ([c5f2132](https://github.com/tidev/titanium_mobile/commit/c5f2132e87d2eca048e2c866ed9e8f2457d7994a)) +* update hyperloop to 7.0.9 to fix dex issues ([829d4ab](https://github.com/tidev/titanium_mobile/commit/829d4ab2b481e5cb4e5ee399ab8cad419267c21d)) + +### Android platform + +* add x/y to ScrollView drag events ([70073c4](https://github.com/tidev/titanium_mobile/commit/70073c425c72d7e3a62ed2bb749c896b0cff832b)) +* added new methods in Ti.Calendar.Calendar module for bulk operations ([25fb9fd](https://github.com/tidev/titanium_mobile/commit/25fb9fd00a1976f3fd2aada0aa11ecac16e5c832)) +* be able to add plugins to build.gradle ([e1212e9](https://github.com/tidev/titanium_mobile/commit/e1212e9fccd79f5c302a8380157288df356081da)) +* enable gradle config caching ([6f0d755](https://github.com/tidev/titanium_mobile/commit/6f0d755e05a01d5abbc66d5610af5f6fdfdceaf8)) +* webview content will fill up the whole Ti.UI.WebView by default ([c817069](https://github.com/tidev/titanium_mobile/commit/c817069cbfc3de352e7fa0d7b93dea45294a7c6e)) + +### iOS platform + +* add direction to ListView scrolling ([81d5d1e](https://github.com/tidev/titanium_mobile/commit/81d5d1e79b13f6677041256e7416f72662c2f2dc)) + +## SDK Module Versions + +| Module | Android version | iOS Version | +| ----------- | --------------- | ----------- | +| facebook | 13.0.0 | 15.0.0 | +| ti.map | 5.6.1 | 7.3.1 | +| ti.webdialog | 2.3.0 | 3.0.2 | +| ti.playservices | 18.3.0 | n/a | +| ti.identity | 3.1.0 | 5.0.0 | +| urlSession | n/a | 4.0.1 | +| ti.coremotion | n/a | 4.0.1 | +| ti.applesignin | n/a | 3.1.2 | +| hyperloop | 7.0.9 | 7.0.9 | + ## [12.5.1](https://github.com/tidev/titanium_mobile/compare/12_5_0_GA...12.5.1) (2024-10-02) ## About this release diff --git a/README.md b/README.md index fb592739dbd..c8b3f977cbc 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ today and benefit from 1:1 sessions with the core team, exclusive modules, merch Learn more about sponsoring TiDev, the organization behind the Titanium SDK, [here](https://github.com/sponsors/tidev) 🚀. -Rodrigo FarfánMatt Delmarterdlewis23Daniel EthierJoe KniesekVittorio SorberaMarcus OlovssonAlessandro La RoccaReshopperGusJason David MillerMichael ZaladonisVincenzo QuacquarelliMighty GmbHFruugulKorelogic LimitedLibemaxJohn Gould +User avatar: Rodrigo FarfánUser avatar: Matt DelmarterUser avatar: dlewis23User avatar: Daniel EthierUser avatar: Joe KniesekUser avatar: User avatar: Vittorio SorberaUser avatar: Marcus OlovssonUser avatar: User avatar: Alessandro La RoccaUser avatar: ReshopperUser avatar: GusUser avatar: Jason David MillerUser avatar: Michael ZaladonisUser avatar: Vincenzo QuacquarelliUser avatar: Mighty GmbHUser avatar: FruugulUser avatar: Korelogic LimitedUser avatar: LibemaxUser avatar: User avatar: John GouldUser avatar: User avatar: Patrick Mounteney ## Features diff --git a/android/app/build.gradle b/android/app/build.gradle index 2577c868951..d89cdc7bbfd 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -9,7 +9,7 @@ apply plugin: 'com.android.application' // Set up Android app project. android { - compileSdkVersion 34 + compileSdkVersion 34 ndkVersion project.ext.tiNdkVersion defaultConfig { applicationId 'com.titanium.test' @@ -86,6 +86,7 @@ dependencies { // exclude group: 'com.google.android.gms' } + implementation "androidx.activity:activity:1.8.0" implementation "androidx.appcompat:appcompat:${project.ext.tiAndroidXAppCompatLibVersion}" implementation "com.google.android.material:material:${project.ext.tiMaterialLibVersion}" } diff --git a/android/modules/calendar/src/java/ti/modules/titanium/calendar/CalendarProxy.java b/android/modules/calendar/src/java/ti/modules/titanium/calendar/CalendarProxy.java index 86082882a18..dd95acc7997 100644 --- a/android/modules/calendar/src/java/ti/modules/titanium/calendar/CalendarProxy.java +++ b/android/modules/calendar/src/java/ti/modules/titanium/calendar/CalendarProxy.java @@ -7,9 +7,13 @@ package ti.modules.titanium.calendar; +import static ti.modules.titanium.calendar.EventProxy.getEventsUri; + import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import java.util.HashMap; +import java.util.Map; import org.appcelerator.kroll.KrollDict; import org.appcelerator.kroll.KrollProxy; @@ -19,11 +23,17 @@ import android.app.Activity; import android.content.ContentResolver; +import android.content.ContentValues; import android.content.pm.PackageManager; import android.database.Cursor; import android.net.Uri; import android.os.Build; +import android.provider.CalendarContract; import android.text.format.DateUtils; +import android.content.ContentProviderOperation; +import android.content.ContentProviderResult; +import android.content.OperationApplicationException; +import android.os.RemoteException; @Kroll.proxy(parentModule = CalendarModule.class) public class CalendarProxy extends KrollProxy @@ -188,12 +198,147 @@ public EventProxy getEventById(int id) return null; } + @Kroll.method + public EventProxy[] getEventsById(Object args) + { + ArrayList events = new ArrayList<>(); + + if (args instanceof Object[] eventIds && eventIds.length > 0) { + String query = CalendarUtils.prepareQuerySelection("_id", eventIds.length); + String[] queryArgs = CalendarUtils.prepareQueryArguments(eventIds); + + events.addAll(EventProxy.queryEvents(query, queryArgs)); + } + + return events.toArray(new EventProxy[0]); + } + @Kroll.method public EventProxy createEvent(KrollDict data) { return EventProxy.createEvent(this, data); } + @Kroll.method + public EventProxy[] createEvents(Object data) + { + // Validate arguments to be an array. + if (!(data instanceof Object[] dataList && dataList.length > 0)) { + Log.e(TAG, "Argument expected to be an array."); + return null; + } + + // Check for permissions. + ContentResolver contentResolver = TiApplication.getInstance().getContentResolver(); + if (!hasCalendarPermissions()) { + Log.e(TAG, "Calendar permissions are missing."); + return null; + } + + ArrayList operations = new ArrayList<>(); + ArrayList eventProxies = new ArrayList<>(); + Map proxyResultIndexMapping = new HashMap<>(); + + for (int i = 0, firstIndex = 0; i < dataList.length; i++) { + KrollDict krollDict = new KrollDict((HashMap) dataList[i]); + + EventProxy eventProxy = new EventProxy(); + ContentValues contentValues = CalendarUtils.createContentValues(this, krollDict, eventProxy); + + // We cannot pass null data to ContentProviderOperation. + // Necessary to keep track of non-null items later. + if (contentValues == null) { + eventProxies.add(null); + Log.e(TAG, "Event was not created, no title found for event"); + continue; + } + + ContentProviderOperation.Builder builder = ContentProviderOperation + .newInsert(CalendarContract.Events.CONTENT_URI) + .withValues(contentValues); + + operations.add(builder.build()); + eventProxies.add(eventProxy); + + proxyResultIndexMapping.put(i, firstIndex); + firstIndex++; + } + + try { + // Execute the batch operation + ContentProviderResult[] results = contentResolver.applyBatch( + getEventsUri().getAuthority(), + operations + ); + + // Find non-null proxies and map their IDs + for (int proxyIndex : proxyResultIndexMapping.keySet()) { + int proxyIndexInResults = proxyResultIndexMapping.get(proxyIndex); + Uri eventUri = results[proxyIndexInResults].uri; + + if (eventUri != null) { + // Set event id to proxy. + eventProxies.get(proxyIndex).id = eventUri.getLastPathSegment(); + } else { + // Event failed to get a proper URI path, should set to null in this case too. + eventProxies.set(proxyIndex, null); + } + } + + return eventProxies.toArray(new EventProxy[0]); + + } catch (RemoteException | OperationApplicationException e) { + Log.e(TAG, "Batch insert operation failed: " + e.getMessage()); + return null; + } + } + + @Kroll.method + public int deleteEvents(Object args) + { + int deletedCount = 0; + + // Validate arguments to be an array. + if (!(args instanceof Object[] eventIds && eventIds.length > 0)) { + Log.e(TAG, "Argument expected to be an array."); + return deletedCount; + } + + // Check for permissions. + ContentResolver contentResolver = TiApplication.getInstance().getContentResolver(); + if (!hasCalendarPermissions()) { + Log.e(TAG, "Calendar permissions are missing."); + return deletedCount; + } + + String query = CalendarUtils.prepareQuerySelection("_id", eventIds.length); + String[] queryArgs = CalendarUtils.prepareQueryArguments(eventIds); + + ArrayList operations = new ArrayList<>(); + ContentProviderOperation.Builder builder = ContentProviderOperation + .newDelete(CalendarContract.Events.CONTENT_URI) + .withSelection(query, queryArgs); + + operations.add(builder.build()); + + try { + // Execute the batch operation + ContentProviderResult[] results = contentResolver.applyBatch( + getEventsUri().getAuthority(), + operations + ); + + if (results.length > 0 && results[0].count != null) { + deletedCount = results[0].count; + } + + } catch (RemoteException | OperationApplicationException e) { + Log.e(TAG, "Batch deletion failed: " + e.getMessage()); + } + + return deletedCount; + } + @Kroll.getProperty public String getName() { diff --git a/android/modules/calendar/src/java/ti/modules/titanium/calendar/CalendarUtils.java b/android/modules/calendar/src/java/ti/modules/titanium/calendar/CalendarUtils.java new file mode 100644 index 00000000000..a1693d76c02 --- /dev/null +++ b/android/modules/calendar/src/java/ti/modules/titanium/calendar/CalendarUtils.java @@ -0,0 +1,90 @@ +package ti.modules.titanium.calendar; + +import android.content.ContentValues; +import android.provider.CalendarContract; +import android.text.TextUtils; + +import org.appcelerator.kroll.KrollDict; +import org.appcelerator.titanium.TiC; +import org.appcelerator.titanium.util.TiConvert; + +import java.util.Collections; +import java.util.Date; + +public class CalendarUtils +{ + public static final String TAG = "CalendarUtils"; + + // Build the selection string for IN clause. + public static String prepareQuerySelection(String columnName, int limit) + { + return columnName + " IN (" + TextUtils.join(", ", Collections.nCopies(limit, "?")) + ")"; + } + + // Creates String[] for selectionArgs. + public static String[] prepareQueryArguments(Object[] data) + { + String[] queryArgs = new String[data.length]; + for (int i = 0; i < data.length; i++) { + queryArgs[i] = String.valueOf(data[i]); + } + return queryArgs; + } + + public static ContentValues createContentValues(CalendarProxy calendar, KrollDict data, EventProxy event) + { + if (!data.containsKey(TiC.PROPERTY_TITLE)) { + return null; + } + + ContentValues contentValues = new ContentValues(); + contentValues.put("hasAlarm", 1); + contentValues.put("hasExtendedProperties", 1); + + event.title = TiConvert.toString(data, TiC.PROPERTY_TITLE); + contentValues.put(TiC.PROPERTY_TITLE, event.title); + contentValues.put("calendar_id", calendar.getId()); + contentValues.put(CalendarContract.Events.EVENT_TIMEZONE, new Date().toString()); + + if (data.containsKey(TiC.PROPERTY_LOCATION)) { + event.location = TiConvert.toString(data, TiC.PROPERTY_LOCATION); + contentValues.put(CalendarModule.EVENT_LOCATION, event.location); + } + + if (data.containsKey(TiC.PROPERTY_DESCRIPTION)) { + event.description = TiConvert.toString(data, TiC.PROPERTY_DESCRIPTION); + contentValues.put(TiC.PROPERTY_DESCRIPTION, event.description); + } + + if (data.containsKey("begin")) { + event.begin = TiConvert.toDate(data, "begin"); + if (event.begin != null) { + contentValues.put("dtstart", event.begin.getTime()); + } + } + + if (data.containsKey(TiC.PROPERTY_END)) { + event.end = TiConvert.toDate(data, TiC.PROPERTY_END); + if (event.end != null) { + contentValues.put("dtend", event.end.getTime()); + } + } + + if (data.containsKey("allDay")) { + event.allDay = TiConvert.toBoolean(data, "allDay"); + contentValues.put("allDay", event.allDay ? 1 : 0); + } + + if (data.containsKey("hasExtendedProperties")) { + event.hasExtendedProperties = TiConvert.toBoolean(data, "hasExtendedProperties"); + contentValues.put("hasExtendedProperties", event.hasExtendedProperties ? 1 : 0); + } + + if (data.containsKey("hasAlarm")) { + event.hasAlarm = TiConvert.toBoolean(data, "hasAlarm"); + contentValues.put("hasAlarm", event.hasAlarm ? 1 : 0); + } + + return contentValues; + } +} diff --git a/android/modules/calendar/src/java/ti/modules/titanium/calendar/EventProxy.java b/android/modules/calendar/src/java/ti/modules/titanium/calendar/EventProxy.java index 9ad71100316..5a5c8f39b43 100644 --- a/android/modules/calendar/src/java/ti/modules/titanium/calendar/EventProxy.java +++ b/android/modules/calendar/src/java/ti/modules/titanium/calendar/EventProxy.java @@ -55,9 +55,9 @@ public EventProxy() super(); } - public static String getEventsUri() + public static Uri getEventsUri() { - return CalendarProxy.getBaseCalendarUri() + "/events"; + return Events.CONTENT_URI; } public static String getInstancesWhenUri() @@ -72,7 +72,7 @@ public static String getExtendedPropertiesUri() public static ArrayList queryEvents(String query, String[] queryArgs) { - return queryEvents(Uri.parse(getEventsUri()), query, queryArgs, "dtstart ASC"); + return queryEvents(getEventsUri(), query, queryArgs, "dtstart ASC"); } public static ArrayList queryEventsBetweenDates(long date1, long date2, String query, @@ -146,7 +146,7 @@ public void save() contentValues.put(Events.RRULE, ruleToSave); ContentResolver contentResolver = TiApplication.getInstance().getContentResolver(); try { - contentResolver.update(Events.CONTENT_URI, contentValues, Events._ID + "=?", new String[] { id }); + contentResolver.update(getEventsUri(), contentValues, Events._ID + "=?", new String[] { id }); } catch (IllegalArgumentException e) { Log.e(TAG, "Invalid event recurrence rule."); } @@ -203,60 +203,20 @@ public static EventProxy createEvent(CalendarProxy calendar, KrollDict data) if (!CalendarProxy.hasCalendarPermissions()) { return null; } - EventProxy event = new EventProxy(); - ContentValues eventValues = new ContentValues(); - eventValues.put("hasAlarm", 1); - eventValues.put("hasExtendedProperties", 1); + EventProxy event = new EventProxy(); + ContentValues contentValues = CalendarUtils.createContentValues(calendar, data, event); - if (!data.containsKey("title")) { + if (contentValues == null) { Log.e(TAG, "Title was not created, no title found for event"); return null; } - event.title = TiConvert.toString(data, "title"); - eventValues.put("title", event.title); - eventValues.put("calendar_id", calendar.getId()); - eventValues.put(Events.EVENT_TIMEZONE, new Date().toString()); - - if (data.containsKey(TiC.PROPERTY_LOCATION)) { - event.location = TiConvert.toString(data, TiC.PROPERTY_LOCATION); - eventValues.put(CalendarModule.EVENT_LOCATION, event.location); - } - if (data.containsKey("description")) { - event.description = TiConvert.toString(data, "description"); - eventValues.put("description", event.description); - } - if (data.containsKey("begin")) { - event.begin = TiConvert.toDate(data, "begin"); - if (event.begin != null) { - eventValues.put("dtstart", event.begin.getTime()); - } - } - if (data.containsKey("end")) { - event.end = TiConvert.toDate(data, "end"); - if (event.end != null) { - eventValues.put("dtend", event.end.getTime()); - } - } - if (data.containsKey("allDay")) { - event.allDay = TiConvert.toBoolean(data, "allDay"); - eventValues.put("allDay", event.allDay ? 1 : 0); - } - - if (data.containsKey("hasExtendedProperties")) { - event.hasExtendedProperties = TiConvert.toBoolean(data, "hasExtendedProperties"); - eventValues.put("hasExtendedProperties", event.hasExtendedProperties ? 1 : 0); - } - - if (data.containsKey("hasAlarm")) { - event.hasAlarm = TiConvert.toBoolean(data, "hasAlarm"); - eventValues.put("hasAlarm", event.hasAlarm ? 1 : 0); + Uri eventUri = contentResolver.insert(Uri.parse(CalendarProxy.getBaseCalendarUri() + "/events"), contentValues); + if (eventUri == null) { + return null; } - Uri eventUri = contentResolver.insert(Uri.parse(CalendarProxy.getBaseCalendarUri() + "/events"), eventValues); - Log.d("TiEvents", "created event with uri: " + eventUri, Log.DEBUG_MODE); - String eventId = eventUri.getLastPathSegment(); event.id = eventId; @@ -565,13 +525,12 @@ public boolean remove() ContentResolver contentResolver = TiApplication.getInstance().getContentResolver(); try { - Uri deleteUri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, TiConvert.toInt(id)); - contentResolver.delete(deleteUri, null, null); + Uri deleteUri = ContentUris.withAppendedId(getEventsUri(), TiConvert.toInt(id)); + int deletedCount = contentResolver.delete(deleteUri, null, null); + return deletedCount == 1; } catch (IllegalArgumentException e) { return false; } - - return true; } @Override diff --git a/android/modules/ui/src/java/ti/modules/titanium/ui/RefreshControlProxy.java b/android/modules/ui/src/java/ti/modules/titanium/ui/RefreshControlProxy.java index f4a8fd62783..c5f5a82f61d 100644 --- a/android/modules/ui/src/java/ti/modules/titanium/ui/RefreshControlProxy.java +++ b/android/modules/ui/src/java/ti/modules/titanium/ui/RefreshControlProxy.java @@ -13,7 +13,9 @@ import org.appcelerator.kroll.annotations.Kroll; import org.appcelerator.kroll.common.Log; import org.appcelerator.titanium.TiC; +import org.appcelerator.titanium.TiDimension; import org.appcelerator.titanium.util.TiColorHelper; +import org.appcelerator.titanium.util.TiConvert; import java.util.HashSet; @@ -30,7 +32,8 @@ public class RefreshControlProxy extends KrollProxy * The default Android log tag name to be used by this class. */ private static final String TAG = "RefreshControlProxy"; - + private static int offsetStart = -1; + private static int offsetEnd = -1; /** * Android's default progress indicator color used by the SwipeRefreshLayout class. * This is defined in Google's "MaterialProgressDrawable.java", which is an internal class. @@ -134,9 +137,18 @@ public void handleCreationDict(KrollDict properties) super.handleCreationDict(properties); // Fetch "tintColor" property, if provided. - value = properties.get(TiC.PROPERTY_TINT_COLOR); - if (value != null) { - onTintColorChanged(value); + if (properties.containsKeyAndNotNull(TiC.PROPERTY_TINT_COLOR)) { + value = properties.get(TiC.PROPERTY_TINT_COLOR); + if (value != null) { + onTintColorChanged(value); + } + } + if (properties.containsKeyAndNotNull("offset")) { + KrollDict offset = properties.getKrollDict("offset"); + offsetStart = new TiDimension(TiConvert.toInt(offset.get("start"), 0), TiDimension.TYPE_TOP) + .getAsPixels(this.swipeRefreshLayout); + offsetEnd = new TiDimension(TiConvert.toInt(offset.get("end"), 80), TiDimension.TYPE_BOTTOM) + .getAsPixels(this.swipeRefreshLayout); } } @@ -275,6 +287,9 @@ public void assignTo(TiSwipeRefreshLayout view) // Set up the given view for pull-down refresh support. view.setColorSchemeColors(this.tintColor); + if (offsetStart != -1 && offsetEnd != -1) { + view.setProgressViewOffset(false, offsetStart, offsetEnd); + } view.setSwipeRefreshEnabled(true); view.setOnRefreshListener(new TiSwipeRefreshLayout.OnRefreshListener() { diff --git a/android/package.json b/android/package.json index cb890f2d580..72d1b882847 100644 --- a/android/package.json +++ b/android/package.json @@ -17,7 +17,7 @@ "integrity": "sha512-A0tV+fYtkpKfIF5roRTCFPtdULMFygmfWlEuuHOBjC3q4rz/mKnAsJTYBlqayC/4oYEWehj867Oh1o6vy26XHQ==" }, "minSDKVersion": "21", - "compileSDKVersion": "33", + "compileSDKVersion": "34", "vendorDependencies": { "android sdk": ">=23.x <=34.x", "android build tools": ">=30.0.2 <=34.x", diff --git a/android/templates/build/ti.constants.gradle b/android/templates/build/ti.constants.gradle index 6988acc5601..27cf7beb9c3 100644 --- a/android/templates/build/ti.constants.gradle +++ b/android/templates/build/ti.constants.gradle @@ -7,11 +7,11 @@ project.ext { tiNdkVersion = '26.2.11394342' - tiAndroidXAppCompatLibVersion = '1.4.1' + tiAndroidXAppCompatLibVersion = '1.7.0' tiAndroidXCoreLibVersion = '1.9.0' - tiAndroidXFragmentLibVersion = '1.5.7' - tiMaterialLibVersion = '1.6.1' - tiPlayServicesBaseLibVersion = '18.2.0' + tiAndroidXFragmentLibVersion = '1.7.1' + tiMaterialLibVersion = '1.12.0' + tiPlayServicesBaseLibVersion = '18.3.0' tiManifestPlaceholders = [ tiActivityConfigChanges: 'density|fontScale|keyboard|keyboardHidden|layoutDirection|locale|mcc|mnc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|touchscreen|uiMode' ] diff --git a/android/titanium/build.gradle b/android/titanium/build.gradle index c3078c48701..a5909b6a936 100644 --- a/android/titanium/build.gradle +++ b/android/titanium/build.gradle @@ -46,7 +46,7 @@ android { ndkVersion project.ext.tiNdkVersion namespace 'org.appcelerator.titanium' defaultConfig { - compileSdk 33 + compileSdk 34 minSdkVersion 21 targetSdkVersion 34 versionName tiBuildVersionString @@ -284,11 +284,11 @@ dependencies { implementation 'androidx.drawerlayout:drawerlayout:1.2.0' implementation 'androidx.exifinterface:exifinterface:1.3.7' implementation "androidx.fragment:fragment:${project.ext.tiAndroidXFragmentLibVersion}" - implementation 'androidx.media:media:1.6.0' + implementation 'androidx.media:media:1.7.0' implementation 'androidx.recyclerview:recyclerview:1.3.2' implementation 'androidx.recyclerview:recyclerview-selection:1.1.0' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' - implementation 'androidx.transition:transition:1.4.1' + implementation 'androidx.transition:transition:1.5.1' implementation 'androidx.vectordrawable:vectordrawable:1.1.0' implementation 'androidx.vectordrawable:vectordrawable-animated:1.1.0' implementation 'androidx.viewpager:viewpager:1.0.0' diff --git a/apidoc/Titanium/Calendar/CalendarProxy.yml b/apidoc/Titanium/Calendar/CalendarProxy.yml index a678efc8776..a612444197f 100644 --- a/apidoc/Titanium/Calendar/CalendarProxy.yml +++ b/apidoc/Titanium/Calendar/CalendarProxy.yml @@ -17,6 +17,21 @@ methods: type: Dictionary platforms: [android, iphone, ipad, macos] + - name: createEvents + summary: Creates multiple events at once in this calendar. + description: | + Use this method to bulk-create events for faster performance. + Successful or failed results are returned at the same position as passed in the parameters list. + For failed events, it will return `null` and for successful events. + returns: + type: Array + parameters: + - name: propertiesArray + summary: Array of the event properties + type: Array> + platforms: [android] + since: {android: "12.6.0"} + - name: getEventById summary: Gets the event with the specified identifier. returns: @@ -27,6 +42,41 @@ methods: type: String platforms: [android, iphone, ipad, macos] + - name: getEventsById + summary: Gets multiple events with their specified identifier(s). + description: | + Use this method to bulk-fetch events for faster performance. + Only successful events are returned, so the identifier of events + should be used to compare which events were not fetched successfully. + returns: + type: Array + parameters: + - name: ids + summary: Array of identifiers of events. + type: [Array, Array] + platforms: [android] + since: {android: "12.6.0"} + + - name: deleteEvents + summary: Deletes multiple events with their specified identifier(s). + description: | + Use this method to bulk-delete events for faster performance. + This method only returns the count of successfully deleted events. + If it is important for apps to know whether the event was deleted or not, + either use the [remove()](Titanium.Calendar.Event.remove) method, or + a single identifier that is passed as an array to this method. + If a specified identifier event does not exist, it will not be treated as a count, + so the count range can be in `0 <= count <= ids.length`. + returns: + type: Number + summary: Count of successfully deleted events. + parameters: + - name: ids + summary: Array of identifiers of events. + type: [Array, Array] + platforms: [android] + since: {android: "12.6.0"} + - name: getEventsBetweenDates summary: Gets events that occur between two dates. returns: diff --git a/apidoc/Titanium/UI/ListView.yml b/apidoc/Titanium/UI/ListView.yml index b6ac0a46f03..b2fa371f090 100644 --- a/apidoc/Titanium/UI/ListView.yml +++ b/apidoc/Titanium/UI/ListView.yml @@ -659,6 +659,30 @@ events: summary: | The expected y axis offset when the scrolling action decelerates to a stop. type: Number + + - name: visibleItemCount + summary: The number of visible items in the list view when the event fires. + type: Number + + - name: firstVisibleItem + summary: The first visible item in the list view when the event fires; this item might not be fully visible. May be -1 on iOS. + type: [Object, Number] + + - name: firstVisibleSection + summary: The first visible section in the list view when the event fires. + type: Titanium.UI.ListSection + + - name: firstVisibleItemIndex + summary: | + The index of the first visible item in the list view when the event fires; this item might not be fully visible. + Note: The index is `-1` when there are no items in the . + type: Number + + - name: firstVisibleSectionIndex + summary: | + The index of the first visible section in the list view when the event fires. + Note: The index is `-1` when there are no items in the . + type: Number properties: - name: allowsSelection diff --git a/apidoc/Titanium/UI/RefreshControl.yml b/apidoc/Titanium/UI/RefreshControl.yml index 1abd9a4c6c8..d3c78eb2b35 100644 --- a/apidoc/Titanium/UI/RefreshControl.yml +++ b/apidoc/Titanium/UI/RefreshControl.yml @@ -55,6 +55,13 @@ properties: platforms: [android, iphone, ipad, macos] since: { android: "6.2.0", iphone: "3.2.0", ipad: "3.2.0" } + - name: offset + summary: Offset of the refresh control view. + type: RefreshControlOffset + platforms: [android] + since: { android: "12.7.0" } + availability: creation + - name: backgroundColor summary: The background color for the refresh control, as a color name or hex triplet. description: | @@ -146,3 +153,13 @@ examples: $.index.open(); ``` +--- +name: RefreshControlOffset +summary: Offset of the refresh control view. +properties: + - name: start + summary: The offset from the top of this view at which the progress spinner should appear. + type: Number + - name: end + summary: The offset from the top of this view at which the progress spinner should come to rest after a successful swipe gesture. + type: Number diff --git a/iphone/TitaniumKit/TitaniumKit/Sources/API/TiUIView.m b/iphone/TitaniumKit/TitaniumKit/Sources/API/TiUIView.m index 3f0331e6921..f433f0bd01f 100644 --- a/iphone/TitaniumKit/TitaniumKit/Sources/API/TiUIView.m +++ b/iphone/TitaniumKit/TitaniumKit/Sources/API/TiUIView.m @@ -1312,7 +1312,6 @@ - (UITapGestureRecognizer *)singleTapRecognizer { if (singleTapRecognizer == nil) { singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(recognizedTap:)]; - [singleTapRecognizer setNumberOfTapsRequired:1]; [self configureGestureRecognizer:singleTapRecognizer]; [self addGestureRecognizer:singleTapRecognizer]; if (doubleTapRecognizer != nil) { @@ -1435,8 +1434,6 @@ - (void)recognizedTap:(UITapGestureRecognizer *)recognizer [proxy fireEvent:@"dblclick" withObject:event propagate:YES]; } [proxy fireEvent:@"doubletap" withObject:event]; - } else if ([recognizer numberOfTapsRequired] == 1 && [proxy _hasListeners:@"click"]) { - [proxy fireEvent:@"click" withObject:event propagate:YES]; } else { [proxy fireEvent:@"singletap" withObject:event]; } @@ -1612,7 +1609,12 @@ - (void)processTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event // Click handling is special; don't propagate if we have a delegate, // but DO invoke the touch delegate. // clicks should also be handled by any control the view is embedded in. - if ([touch tapCount] == 2 && [proxy _hasListeners:@"dblclick"]) { + if ([touch tapCount] == 1 && [proxy _hasListeners:@"click"]) { + if (touchDelegate == nil) { + [proxy fireEvent:@"click" withObject:evt propagate:YES]; + return; + } + } else if ([touch tapCount] == 2 && [proxy _hasListeners:@"dblclick"]) { [proxy fireEvent:@"dblclick" withObject:evt propagate:YES]; return; } diff --git a/iphone/iphone/Titanium.plist b/iphone/iphone/Titanium.plist index 997d287518d..c2bc373aac4 100644 --- a/iphone/iphone/Titanium.plist +++ b/iphone/iphone/Titanium.plist @@ -59,10 +59,6 @@ Can we use your microphone? NSPhotoLibraryUsageDescription Can we save to your photo library? - UIAppFonts - - comic_zine_ot.otf - UILaunchStoryboardName LaunchScreen UIRequiresFullScreen diff --git a/package-lock.json b/package-lock.json index 0f2d21a575d..6b96c4de6b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "colors": "1.4.0", "ejs": "3.1.9", "fields": "0.1.24", - "fs-extra": "11.2.0", + "fs-extra": "10.0.0", "ioslib": "1.7.39", "liveview": "1.5.6", "lodash.merge": "4.6.2", @@ -80,7 +80,7 @@ "nyc": "15.1.0", "request-promise-native": "1.0.9", "rollup": "2.76.0", - "ssri": "10.0.4", + "ssri": "8.0.1", "stream-splitter": "0.3.2", "strip-ansi": "6.0.1", "titanium": "6.1.1", @@ -4957,6 +4957,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/cacache/node_modules/ssri": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/cacheable-lookup": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", @@ -7757,16 +7769,17 @@ } }, "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { - "node": ">=14.14" + "node": ">=12" } }, "node_modules/fs-minipass": { @@ -10732,6 +10745,18 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/make-fetch-happen/node_modules/ssri": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", @@ -12777,6 +12802,18 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/pacote/node_modules/ssri": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -14812,22 +14849,16 @@ } }, "node_modules/ssri": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", - "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "license": "ISC", "dependencies": { - "minipass": "^5.0.0" + "minipass": "^3.1.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ssri/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "engines": { - "node": ">=8" + "node": ">= 8" } }, "node_modules/stack-trace": { @@ -19887,6 +19918,14 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" + }, + "ssri": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", + "requires": { + "minipass": "^7.0.3" + } } } }, @@ -21950,9 +21989,9 @@ "dev": true }, "fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -24171,6 +24210,14 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==" + }, + "ssri": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", + "requires": { + "minipass": "^7.0.3" + } } } }, @@ -25687,6 +25734,14 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==" + }, + "ssri": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", + "requires": { + "minipass": "^7.0.3" + } } } }, @@ -27181,18 +27236,12 @@ } }, "ssri": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", - "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, "requires": { - "minipass": "^5.0.0" - }, - "dependencies": { - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" - } + "minipass": "^3.1.1" } }, "stack-trace": { diff --git a/package.json b/package.json index 347236f6f39..5a958725048 100644 --- a/package.json +++ b/package.json @@ -99,7 +99,7 @@ "colors": "1.4.0", "ejs": "3.1.9", "fields": "0.1.24", - "fs-extra": "11.2.0", + "fs-extra": "10.0.0", "ioslib": "1.7.39", "liveview": "1.5.6", "lodash.merge": "4.6.2", @@ -155,7 +155,7 @@ "nyc": "15.1.0", "request-promise-native": "1.0.9", "rollup": "2.76.0", - "ssri": "10.0.4", + "ssri": "8.0.1", "stream-splitter": "0.3.2", "strip-ansi": "6.0.1", "titanium": "6.1.1",