Repository navigation
Release 2.0.0 - #15
Merged
Merged
Conversation
… returns The activity and ReviewManager were scoped with using var, so both AndroidJavaObjects were disposed before Play Services invoked ReviewFlowListener.onComplete, and launchReviewFlow always threw a NullReferenceException. Ownership now passes to the listener, which disposes both in a finally block, and RequestReviewAndroid disposes them itself when registration throws. Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Delete ISafeAreaService, SafeAreaService, and SafeAreaContainer with their tests; narrow DeviceService to five children; remove the simulator override and sample/docs references. BREAKING: IDeviceService.SafeArea is gone; use com.gamelovers.uiservice SafeAreaPanelView/SafeAreaContainer for UI safe-area needs.
Vendor NSubstitute 4.2.2, Castle.Core 4.4.0, and System.Threading.Tasks.Extensions 4.3.0 with their license texts under Tests/EditMode/Plugins/ so the EditMode suite compiles and loads in Unity. Stay on 4.x: the 5.x set fails plugin validation because Castle.Core 5.1.1 references System.Diagnostics.EventLog, which Unity cannot resolve (verified 2026-09-11). Full EditMode suite: 133/133 green.
The shared block now says the harness already prints the fixture count, that the post-fix observation is one re-run of the same probe, and that correcting an existing ADMIT or RCR line is itself a claim about production which must be read and re-checked. Edited identically in all six packages; Tools/lint-agent-guides.py fails if they diverge. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…lCase AGENTS.md gives private fields _camelCase, says explicitly that static fields are included, and gives private constants plain PascalCase, but nothing enforced it: this repository has no .editorconfig and the style audit gated documentation and ordering only. A hand-rolled checker in an earlier session mis-classified three of its four hits, which is what a rule with no mechanical owner costs. Renames are identifier-only; no comment prose and no string literal changed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Permissions.m uses CoreLocation and Photos and NativeUi.m uses StoreKit, but their plugin import settings declared no frameworks, so a Unity-generated Xcode project failed to link UnityFramework with undefined CLLocationManager, PHPhotoLibrary and SKStoreReviewController. The import settings were written by Unity 6000.6.4f1 through PluginImporter.SetPlatformData.
…ile declared iOS groups Add PermissionStatus.Limited and DeviceService.OpenAppSettings. Android requests precise and approximate location together, asks for background location separately, reports Denied after a refusal, and uses API-level specific photo, notification and gallery permissions. iOS maps limited photos, provisional notifications and reduced-accuracy location to Limited, serves notification status from a cache, and releases location delegates after delivery. The build postprocessor compiles only the iOS permission groups whose usage description is declared. The config Inspector is grouped by feature with per-section build summaries. Co-authored-by: Cursor <cursoragent@cursor.com>
…store links, screenshot share Notifications carry an application-defined Data payload and report opened notifications and the cold-start launch notification. Android image sharing uses a package FileProvider that the build postprocessor declares behind a config toggle, and ShareScreenshotAsync shares the current frame. DeviceService gains OpenStorePage and IBackgroundTaskService (iOS background task bridge, pass-through elsewhere). Android intent-filter registrations can set AutoVerify for verified App Links. The Gradle dependency injection is generalized from the Play Review special case. BREAKING: IGameNotification, INotificationService, INativeUiService and IDeviceService gained members; the DeviceService injection constructor takes an IBackgroundTaskService. Co-authored-by: Cursor <cursoragent@cursor.com>
NativeMediaService saves images and videos to the device gallery and picks one image through the system picker. iOS uses PHPhotoLibrary (compiled only when the add-only usage description is declared) and PHPickerViewController; Android uses MediaStore and a transparent picker activity declared behind a config toggle. The iOS photos permission group is split into read/write and add-only, and the simulator saves into Library and picks from a file dialog. Co-authored-by: Cursor <cursoragent@cursor.com>
…vices GamePlatformServices signs the player in and reports scores and achievements, with leaderboard and achievement UIs. iOS uses a GameKit bridge compiled only when the Game Center capability is enabled; Android talks to Play Games Services v2 through JNI so the package builds without the SDK, which the postprocessor adds when a project id is configured. PlatformId carries per-platform ids and the Device Simulator panel simulates the service in the Editor. Co-authored-by: Cursor <cursoragent@cursor.com>
…saved games ICloudSaveService, reached through IGamePlatformServices.CloudSave, lists, loads, saves and deletes slots with MostRecent or Manual conflict resolution and typed failures. iOS uses GKSavedGame through a bridge that keeps its own background task while saving; Android uses Play Games snapshots over JNI. A Cloud Save config toggle adds the iCloud Documents capability, and the Device Simulator panel stores simulated saves, injects conflicts and toggles availability. Co-authored-by: Cursor <cursoragent@cursor.com>
DeviceService.SetShortcuts publishes quick actions whose taps arrive through IDeepLinkService: Android uses ShortcutManager with an explicit ACTION_VIEW intent, iOS hooks the app delegate shortcut callback and chains to existing implementations. NativeUiService.OpenInAppBrowser shows http and https pages in SFSafariViewController or Chrome Custom Tabs, with the androidx.browser dependency injected behind an opt-out config toggle. Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Fold single-use static helpers (store links, shortcut rules, build summary) into their owners, turn the simulator section factories into Foldout types, document the public and internal API to the XML documentation tiers, replace else branches with guard clauses, order test helpers after the tests, and rebuild the moved tests with observed RED/GREEN mutation records. Co-authored-by: Cursor <cursoragent@cursor.com>
Rename build-pipeline.md to build-configuration.md and explorer.md to device-simulator.md with their meta files, delete docs/README.md, and add a documentation table and common issues to the root README. Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
New:
GamePlatformServices(IGamePlatformServices) for Game Center and Google Play Games Services v2: sign-in, leaderboards, achievements and their native UIs, withPlatformIdto keep per-platform ids in one value. Enable it with theGame Centertoggle and thePlay Games Project Idin the Mobile Services Config; the build then adds the entitlement, or the SDK and manifest entries.IGamePlatformServices.CloudSave(ICloudSaveService) for slot-based saves on Game Center saved games and Google Play Games saved games, withMostRecentorManualconflict resolution and typedCloudSaveExceptionfailures. TheCloud Saveconfig toggle adds the iCloud Documents capability on iOS.PermissionStatus.Limitedfor partial access (selected photos, provisional notifications, approximate location, foreground-only location) andDeviceService.OpenAppSettings()to send the player to the OS Settings page after a denial.NativeMediaService.SaveToGalleryAsyncto save an image or video to the device gallery andPickImageAsyncto pick an image with the system picker, both without asking for the Photos permission. Android uses the newInclude Media PickerandWrite External Storage Legacyconfig toggles; iOS gallery saving needs aPhotoLibraryAddOnlyusage description.NativeUiService.OpenInAppBrowserfor web pages inSFSafariViewControlleror Chrome Custom Tabs (the build addsandroidx.browserunlessInclude Custom Tabs Dependencyis turned off), andShareScreenshotAsyncto share the current frame.IGameNotification.DataandNotificationBuilder.Datafor a payload such as a deep-link URI,INotificationService.OnNotificationOpenedfor taps while the app runs, andTryGetLaunchNotificationfor the notification that started the app.DeviceService.SetShortcutsandClearShortcutsfor home-screen quick actions whose taps arrive throughIDeepLinkService, including as the cold-start link.IDeviceService.BackgroundTasks(IBackgroundTaskService) to finish short work when the app moves to the background on iOS; it is a pass-through on Android.DeviceService.OpenStorePageto open the App Store or Google Play page, optionally the iOS write-review sheet.AutoVerifyso https links open as verified App Links.Enable Haptics Debug Logsconfig toggle; Editor haptics logs are disabled by default.Changed:
IGameNotification,INotificationService,INativeUiServiceandIDeviceServicegained members, and theDeviceServiceinjection constructor takes anIBackgroundTaskService. Custom implementations and mocks must add them.Manage Native Build Manuallycompiles every permission group.com.unity.modules.screencaptureandcom.unity.modules.imageconversionmodules.Fixed:
Deniedafter a refusal, use the correct permissions below API 33, and no longer prompt for storage just to save to the gallery.Include Share FileProvider); previously it used afile://URI the OS rejects.requestReviewFlowcallback completes, preventing aNullReferenceExceptioninlaunchReviewFlow.Removed:
ISafeAreaService,SafeAreaService, and theSafeAreaContainerUI Toolkit element;IDeviceServiceno longer exposes aSafeAreachild andEditorPlatformSimulatorno longer exposes safe-area overrides. For safe-area UI padding, usecom.gamelovers.uiservice(SafeAreaPanelView/SafeAreaContainer).Docs:
docs/build-pipeline.mdis nowdocs/build-configuration.md,docs/explorer.mdis nowdocs/device-simulator.md, anddocs/README.mdis removed.Migration:
IDeviceService.SafeAreaandSafeAreaContainerwithcom.gamelovers.uiserviceSafeAreaPanelView/SafeAreaContainer.Data,OnNotificationOpened,TryGetLaunchNotification,BackgroundTasksand the newINativeUiServicemethods to custom implementations and mocks, and pass anIBackgroundTaskServiceto theDeviceServiceconstructor.PermissionStatus.Limitedas usable access in code that switches onPermissionStatus.AccessFineLocationnow also declaresACCESS_COARSE_LOCATION, which Android 12+ requires; addAccessBackgroundLocationforAppPermission.LocationAlways.