{ "id": "170981", "key": "TIMOB-25726", "fields": { "issuetype": { "id": "4", "description": "An improvement or enhancement to an existing feature or task.", "name": "Improvement", "subtask": false }, "project": { "id": "10153", "key": "TIMOB", "name": "Titanium SDK/CLI", "projectCategory": { "id": "10100", "description": "Titanium and related SDKs used in application development", "name": "Client" } }, "fixVersions": [ { "id": "20033", "name": "Release 9.0.0", "archived": false, "released": true, "releaseDate": "2020-03-18" } ], "resolution": { "id": "1", "description": "A fix for this issue is checked into the tree and tested.", "name": "Fixed" }, "resolutiondate": "2020-01-31T12:28:14.000+0000", "created": "2018-01-26T02:54:53.000+0000", "priority": { "name": "High", "id": "2" }, "labels": [ "android", "google-play-services", "module" ], "versions": [], "issuelinks": [ { "id": "58101", "type": { "id": "10003", "name": "Relates", "inward": "relates to", "outward": "relates to" }, "outwardIssue": { "id": "174643", "key": "TIMOB-27729", "fields": { "summary": "Android: Build \"ti.playservices\" module with gradle", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "priority": { "name": "High", "id": "2" }, "issuetype": { "id": "4", "description": "An improvement or enhancement to an existing feature or task.", "name": "Improvement", "subtask": false } } } }, { "id": "56271", "type": { "id": "10003", "name": "Relates", "inward": "relates to", "outward": "relates to" }, "inwardIssue": { "id": "170781", "key": "TIMOB-25665", "fields": { "summary": "Android: Update Ti.Playservices libraries to latest (11.8.0?)", "status": { "description": "The issue is open and ready for the assignee to start work on it.", "name": "Open", "id": "1", "statusCategory": { "id": 2, "key": "new", "colorName": "blue-gray", "name": "To Do" } }, "priority": { "name": "Medium", "id": "3" }, "issuetype": { "id": "4", "description": "An improvement or enhancement to an existing feature or task.", "name": "Improvement", "subtask": false } } } } ], "assignee": { "name": "jquick", "key": "jquick", "displayName": "Joshua Quick", "active": true, "timeZone": "America/Los_Angeles" }, "updated": "2020-01-31T12:28:14.000+0000", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "components": [ { "id": "10202", "name": "Android", "description": "Android Platform" } ], "description": "*Summary:*\r\nThe Google Play Services libraries (included with \"ti.playservices\" module) are merely an interface to the installed Google Play Services app/apk. The app must ensure that Google Play Services is installed on the device and that its apk version is greater or equal to the version of the Google Play Services libraries that the app includes... or else the library's APIs will fail or throw an exception.\r\n\r\nGoogle documents the above here...\r\nhttps://developers.google.com/android/guides/setup#ensure_devices_have_the_google_play_services_apk\r\n\r\n*Feature Requirements:*\r\n# The Google Play Services check should be done when the Titanium splashscreen is displayed (ie: TiLaunchActivity.java) and before executing the \"app.js\" script.\r\n# Do not run the check if \"ti.playservices\" module is not included in the app. (In this case, assume app does not use Google Play Services.)\r\n# If Google Play Services is found to be too old or disabled, display an alert asking end-user to resolve it. Keep the end-user on the launcher screen in this case.\r\n# If end-user chooses to update Google Play Services, remain on the launcher screen until the download completes, then proceed on to execute the \"app.js\" script.\r\n# Do not display an alert if the device does not have Google Play installed and proceed to execute the \"app.js\" script. In this case, assume the app is not distributed via the Google Play app store (such as Amazon) or the app is running via an emulator without Google Play installed.\r\n# Add \"tiapp.xml\" boolean property \"ti.playservices.validate.on.startup\" which when set {{false}} will disable this feature. In this case, it is the app developer's responsibility to manage this.\r\n\r\n*Note:*\r\nCurrently, Titanium's \"ti.playservices\" module purposely uses Google Play Services library versions a few revs old to avoid the failure mentioned above. Once we update a Titanium app to install the newest version of Google Play Services on startup, we no longer have to fear this issue and we can keep the module's libraries up-to-date.", "attachment": [ { "id": "64764", "filename": "UpdateScreenshot.png", "author": { "name": "jquick", "key": "jquick", "displayName": "Joshua Quick", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2018-01-26T23:31:02.000+0000", "size": 367411, "mimeType": "image/png" } ], "flagged": false, "summary": "Android: Ensure device's installed Google Play Services is available/updated on app startup", "creator": { "name": "jquick", "key": "jquick", "displayName": "Joshua Quick", "active": true, "timeZone": "America/Los_Angeles" }, "subtasks": [], "reporter": { "name": "jquick", "key": "jquick", "displayName": "Joshua Quick", "active": true, "timeZone": "America/Los_Angeles" }, "environment": null, "closedSprints": [ { "id": 1028, "state": "closed", "name": "2018 Sprint 09 SDK", "startDate": "2018-04-22T22:53:08.928Z", "endDate": "2018-05-06T22:53:00.000Z", "completeDate": "2018-05-07T00:02:15.883Z", "originBoardId": 114 }, { "id": 1000, "state": "closed", "name": "2018 Sprint 04 SDK", "startDate": "2018-02-12T04:23:01.913Z", "endDate": "2018-02-26T04:23:00.000Z", "completeDate": "2018-02-26T19:36:01.769Z", "originBoardId": 114 }, { "id": 1018, "state": "closed", "name": "2018 Sprint 07 SDK", "startDate": "2018-03-25T21:59:36.637Z", "endDate": "2018-04-08T21:59:00.000Z", "completeDate": "2018-04-08T17:55:14.467Z", "originBoardId": 114 }, { "id": 1021, "state": "closed", "name": "2018 Sprint 08 SDK", "startDate": "2018-04-08T17:57:36.122Z", "endDate": "2018-04-22T17:57:00.000Z", "completeDate": "2018-04-22T22:51:19.120Z", "originBoardId": 114 }, { "id": 1008, "state": "closed", "name": "2018 Sprint 06 SDK", "startDate": "2018-03-11T22:18:04.396Z", "endDate": "2018-03-25T22:18:00.000Z", "completeDate": "2018-03-25T21:52:36.683Z", "originBoardId": 216 } ], "comment": { "comments": [ { "id": "433708", "author": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "body": "Following up our discussion on Github, I disagree that we should show any alert for the developer. The developer should understand that he_she needs to check for the play-services him_herself and break if not installed. Otherwise, I see tickets like \"Unwanted alert shown\" and \"Cannot change alert title\" incoming. If we can provide a way where the developer can check the status, there is nothing else we should do for him / her. I'd be interested how other frameworks solve that and how developers would prefer the way it's handled.", "updateAuthor": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "created": "2018-01-26T11:12:17.000+0000", "updated": "2018-01-26T11:12:17.000+0000" }, { "id": "433734", "author": { "name": "jquick", "key": "jquick", "displayName": "Joshua Quick", "active": true, "timeZone": "America/Los_Angeles" }, "body": "[~hknoechel], I think you misunderstood how this works. If the version installed on the device is too old, then we would display a \"localized\" alert to the end-user (not the developer) for permission to download the newest version via Google's makeGooglePlayServicesAvailable() API. There is no API to download the newest version without showing an alert. This is the only means of doing so.\r\nhttps://developers.google.com/android/reference/com/google/android/gms/common/GoogleApiAvailability.html#makeGooglePlayServicesAvailable(android.app.Activity)\r\n\r\nYou're expected to do this on app launch. That's how Google documents it. That's how most apps handle it. Please trust me on this. I've done this before.\r\n\r\nNow, I am okay with us adding a \"tiapp.xml\" option to disable this feature upon app launch and have the Titanium developer do this themselves. But that should be something the developer knowing opts-in to where our documentation then points them to the \"ti.playservices\" where they must do this themselves.", "updateAuthor": { "name": "jquick", "key": "jquick", "displayName": "Joshua Quick", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2018-01-26T19:19:12.000+0000", "updated": "2018-01-26T19:19:12.000+0000" }, { "id": "437935", "author": { "name": "miniman42", "key": "miniman42", "displayName": "Greg", "active": true, "timeZone": "America/Los_Angeles" }, "body": "FWIW, we use an updated ti.playservices (11.8.0) and perform the API level availability check on demand later in the app lifecycle through our own module using GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this) (which can be run from a background service on app launch if the app uses one). \r\n\r\nWe can then choose to run makeGooglePlayServicesAvailable (which we have modified to broadcast an app event on completion) when the app is active in the foreground. \r\n\r\nWe need this level of control for our use case so if this is not going to be the appcelerator approach, then it would be very beneficial to provide a tiapp.xml option to allow developers disable the automatic update if a developer wants to control the update themselves as we do currently. ", "updateAuthor": { "name": "miniman42", "key": "miniman42", "displayName": "Greg", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2018-05-24T23:32:33.000+0000", "updated": "2018-05-24T23:32:33.000+0000" }, { "id": "437937", "author": { "name": "jquick", "key": "jquick", "displayName": "Joshua Quick", "active": true, "timeZone": "America/Los_Angeles" }, "body": "[~miniman42], yes, I think making it settable via a property in the \"tiapp.xml\" is a good way to go too. By default, we'll handle it on startup. But with this property you can disable it and handle it yourself (you're opting-in to handling it yourself).", "updateAuthor": { "name": "jquick", "key": "jquick", "displayName": "Joshua Quick", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2018-05-25T01:09:12.000+0000", "updated": "2018-05-25T01:09:12.000+0000" }, { "id": "446333", "author": { "name": "gmathews", "key": "gmathews", "displayName": "Gary Mathews", "active": true, "timeZone": "America/Los_Angeles" }, "body": "ti.playservices: https://github.com/appcelerator-modules/ti.playservices/releases/tag/16.1.2\r\n\r\nCan use the {{makeGooglePlayServicesAvailable}} method to determine Google Play Services compatibility.", "updateAuthor": { "name": "gmathews", "key": "gmathews", "displayName": "Gary Mathews", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2019-02-26T21:43:31.000+0000", "updated": "2019-02-26T21:43:31.000+0000" }, { "id": "446337", "author": { "name": "miniman42", "key": "miniman42", "displayName": "Greg", "active": true, "timeZone": "America/Los_Angeles" }, "body": "@gmathews Can we control this behaviour with a tiapp.xml property as per my comment above?", "updateAuthor": { "name": "miniman42", "key": "miniman42", "displayName": "Greg", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2019-02-26T22:50:31.000+0000", "updated": "2019-02-26T22:50:31.000+0000" }, { "id": "446366", "author": { "name": "gmathews", "key": "gmathews", "displayName": "Gary Mathews", "active": true, "timeZone": "America/Los_Angeles" }, "body": "[~miniman42] By default this check is disabled unless {{PlayServices.makeGooglePlayServicesAvailable(callback)}} is called. So it's not necessary to have a {{tiapp.xml}} property here.", "updateAuthor": { "name": "gmathews", "key": "gmathews", "displayName": "Gary Mathews", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2019-02-27T18:45:56.000+0000", "updated": "2019-02-27T18:46:10.000+0000" }, { "id": "453778", "author": { "name": "jquick", "key": "jquick", "displayName": "Joshua Quick", "active": true, "timeZone": "America/Los_Angeles" }, "body": "PR: https://github.com/appcelerator-modules/ti.playservices/pull/32\r\nPR: https://github.com/appcelerator/titanium_mobile/pull/11456\r\n", "updateAuthor": { "name": "jquick", "key": "jquick", "displayName": "Joshua Quick", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2020-01-23T04:30:46.000+0000", "updated": "2020-01-28T03:59:11.000+0000" }, { "id": "453883", "author": { "name": "lchoudhary", "key": "lchoudhary", "displayName": "Lokesh Choudhary", "active": true, "timeZone": "America/Los_Angeles" }, "body": "FR Passed.", "updateAuthor": { "name": "lchoudhary", "key": "lchoudhary", "displayName": "Lokesh Choudhary", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2020-01-29T19:18:01.000+0000", "updated": "2020-01-29T19:18:01.000+0000" }, { "id": "453929", "author": { "name": "cwilliams", "key": "cwilliams", "displayName": "Christopher Williams", "active": true, "timeZone": "America/New_York" }, "body": "merged to master for 9.0.0", "updateAuthor": { "name": "cwilliams", "key": "cwilliams", "displayName": "Christopher Williams", "active": true, "timeZone": "America/New_York" }, "created": "2020-01-30T14:58:37.000+0000", "updated": "2020-01-30T14:58:37.000+0000" }, { "id": "453978", "author": { "name": "ssaddique", "key": "ssaddique", "displayName": "Sohail Saddique", "active": true, "timeZone": "Europe/London" }, "body": "Ticket verified on build: 9.0.0.v20200130113429. Ticket closed.", "updateAuthor": { "name": "ssaddique", "key": "ssaddique", "displayName": "Sohail Saddique", "active": true, "timeZone": "Europe/London" }, "created": "2020-01-31T12:28:03.000+0000", "updated": "2020-01-31T12:28:03.000+0000" } ], "maxResults": 14, "total": 14, "startAt": 0 } } }