OK: one last big push for this.

I have a branch on my fork of cordova-android with the necessary native
changes [1].

I have updated the manual tests for location in mobile-spec [2] so that it
is easy to explicitly test the cordova plugin version vs. the version
attached to navigator.geolocation (presumably the "native" version). I
might also add a few more Qunit tests but there isn't much to add there,
as it's difficult to assert things about the state of GPS visibility on a
device, etc.

SO: the iOS native bits seem to be doing OK following Shaz's/Becky's
review. Android peeps: can you take a look? I did testing last night on my
ICS phone and it worked well.

I would like to see this get in today but I understand if we don't want to
get it into master before we tag 1.6.0 :)

[1] https://github.com/filmaj/incubator-cordova-android/tree/geoupdate
[2] https://github.com/filmaj/incubator-cordova-mobile-spec/tree/geoupdate

On 3/29/12 12:56 PM, "Filip Maj" <[email protected]> wrote:

>Updated my branch with that change now.
>
>On 3/29/12 11:31 AM, "Filip Maj" <[email protected]> wrote:
>
>>Good catch Becky, thanks. I'll patch that shortly.
>>
>>On 3/29/12 11:02 AM, "Becky Gibson" <[email protected]> wrote:
>>
>>>I think there is an issue in the LocationManager: didUpdateToLocation:
>>>fromLocation method.  The NSFastEnumeration protocol for NSDictionary
>>>iterates over the keys and based how watchCallbacks is created I think
>>>you
>>>want the object.
>>>
>>>Thus, I think this:
>>>
>>>for (NSString *callbackId in self.locationData.watchCallbacks) {
>>>            [self returnLocationInfo:callbackId];
>>>        }
>>>
>>>should be:
>>>
>>>for (NSString *timerId in self.locationData.watchCallbacks) {
>>>            [self returnLocationInfo:[self.locationData.watchCallbacks
>>>objectForKey: timerId ]];
>>>        }
>>>
>>>-becky
>>>
>>>On Wed, Mar 28, 2012 at 9:37 PM, Shazron <[email protected]> wrote:
>>>
>>>> Never mind - saw that NetworkStatus commit was already in the mainline
>>>>as
>>>> well
>>>>
>>>> 2012/3/28 Shazron <[email protected]>:
>>>> > Oh - when you merge it in, don't squash your commits in this case
>>>> > unless you list all the changes in the squash. Good to know about
>>>>the
>>>> > "Network Status" change since I needed to know about this in the
>>>> > updated guides I'm writing.
>>>> >
>>>> > 2012/3/28 Filip Maj <[email protected]>:
>>>> >> Thanks for looking it over Shaz, much appreciated - the link helps
>>>>too.
>>>> I
>>>> >> am slowly getting over my aversion of invoking functions using
>>>>square
>>>> >> brackets and accepting objective-c for what it is.
>>>> >>
>>>> >> On 3/28/12 4:26 PM, "Shazron" <[email protected]> wrote:
>>>> >>
>>>> >>>Looks good Fil - good to get the iOS only cruft out of there.
>>>> >>>
>>>> >>>Minor point but there's a way to hide the private vars in the
>>>> >>>implementation file since users won't need to really see them in
>>>>the
>>>> >>>public headers, through class extensions:
>>>> >>>
>>>>
>>>>http://stackoverflow.com/questions/5826345/how-to-declare-instance-vari
>>>>a
>>>>b
>>>>l
>>>> >>>es-and-methods-not-visible-or-usable-outside-of-t
>>>> >>>Not that prevents access, just visibility, and we are open source
>>>>after
>>>> >>>all...
>>>> >>>
>>>> >>>2012/3/28 Filip Maj <[email protected]>:
>>>> >>>> I've sent a pull request to both apache/cordova-js and
>>>> >>>>apache/cordova-ios
>>>> >>>> for the geo stuff (side note: github pull requests might be
>>>>broken
>>>> again
>>>> >>>> :/)
>>>> >>>>
>>>> >>>> https://github.com/apache/incubator-cordova-ios/pull/8
>>>> >>>>
>>>> >>>>
>>>> >>>> The above gets the native iOS geolocation plugin lined up to the
>>>>new
>>>> >>>> interface imposed by cordova-js.
>>>> >>>>
>>>> >>>> The JS file is bundled in the branch so you don't need to rebuild
>>>> >>>> cordova-js to see these improvements.
>>>> >>>>
>>>> >>>> Shaz and anyone else keen on the iOS platform: can you guys take
>>>>a
>>>> look?
>>>> >>>> My tests on my end look good but would love another set of eyes.
>>>> >>>>
>>>> >>>> On 3/27/12 5:00 PM, "Filip Maj" <[email protected]> wrote:
>>>> >>>>
>>>> >>>>>So we'll keep it around (even though we won't override the
>>>> >>>>>implementation
>>>> >>>>>that we get for free in the WebView), and thus we'll need to
>>>>update
>>>> the
>>>> >>>>>native implementation. Gotcha. I will update the JIRA issue as
>>>>such
>>>> >>>>>then.
>>>> >>>>>
>>>> >>>>>On 3/27/12 4:57 PM, "Joe Bowser" <[email protected]> wrote:
>>>> >>>>>
>>>> >>>>>>We should axe it/move it to its own plugins repo.  Someone may
>>>>want
>>>> it,
>>>> >>>>>>but
>>>> >>>>>>I don't want to make promises for it.
>>>> >>>>>>
>>>> >>>>>>On Tue, Mar 27, 2012 at 4:55 PM, Filip Maj <[email protected]>
>>>>wrote:
>>>> >>>>>>
>>>> >>>>>>> I am going to assume then that will be merged in and we'll be
>>>> making
>>>> >>>>>>>the
>>>> >>>>>>> necessary native tweaks across the platforms we want to
>>>>support.
>>>> >>>>>>>
>>>> >>>>>>> ANDROID peeps: should we axe native geo code, or should we
>>>>keep
>>>>it
>>>> >>>>>>>around
>>>> >>>>>>> and thus update the implementation to follow this new
>>>>approach?
>>>> >>>>>>>
>>>> >>>>>>> On 3/27/12 3:33 PM, "Shazron" <[email protected]> wrote:
>>>> >>>>>>>
>>>> >>>>>>> >Apple should be following W3C, although I don't know if they
>>>>fixed
>>>> >>>>>>> >this bug yet, it's still unresolved for me in Radar:
>>>> >>>>>>> >http://openradar.appspot.com/radar?id=1160403 but based on
>>>>what
>>>> my
>>>> >>>>>>> >test on 5.1, they've fixed it.
>>>> >>>>>>> >
>>>> >>>>>>> >Sure ping me on email/jabber let's set up a time.
>>>> >>>>>>> >
>>>> >>>>>>> >On Tue, Mar 27, 2012 at 3:07 PM, Filip Maj <[email protected]>
>>>>wrote:
>>>> >>>>>>> >> Assuming that the native WebView implementations across
>>>>whatever
>>>> >>>>>>> >>platforms
>>>> >>>>>>> >> adhere to the W3C Geo spec, then these native changes would
>>>>line
>>>> >>>>>>>up
>>>> >>>>>>>our
>>>> >>>>>>> >> implementation with what users are expecting in their
>>>>browser.
>>>> >>>>>>> >>
>>>> >>>>>>> >> I can help with tweaking the implementation on iOS, but
>>>>would
>>>> love
>>>> >>>>>>>if
>>>> >>>>>>> >>you
>>>> >>>>>>> >> could once-over it, Shaz, and perhaps jump on a quick
>>>>remote
>>>> hack
>>>> >>>>>>>sesh
>>>> >>>>>>> >> with me for 15-20 mins to make sure we are looking good.
>>>> >>>>>>> >>
>>>> >>>>>>> >> On 3/27/12 2:46 PM, "Shazron" <[email protected]> wrote:
>>>> >>>>>>> >>
>>>> >>>>>>> >>>Thanks Fil - I'm all for fixing geolocation in iOS. There's
>>>> >>>>>>>several
>>>> >>>>>>> >>>jira issues for it, and I've been attempting to fix it as
>>>>best I
>>>> >>>>>>>can,
>>>> >>>>>>> >>>but users are still reporting problems with it since it
>>>>doesn't
>>>> >>>>>>>match
>>>> >>>>>>> >>>the native implementation of UIWebView.
>>>> >>>>>>> >>>
>>>> >>>>>>> >>>On Mon, Mar 26, 2012 at 4:00 PM, Filip Maj <[email protected]>
>>>> wrote:
>>>> >>>>>>> >>>> Hey all,
>>>> >>>>>>> >>>>
>>>> >>>>>>> >>>> The past week or so I've been working on revamping the
>>>> >>>>>>>geolocation
>>>> >>>>>>> >>>>tests according to what is laid out by the W3C API [1].
>>>>Been
>>>> >>>>>>>tracking
>>>> >>>>>>> >>>>progress and whatnot in a JIRA issue [2].
>>>> >>>>>>> >>>>
>>>> >>>>>>> >>>> Good news: I've got the tests implemented plus cordova-js
>>>> >>>>>>>passing
>>>> >>>>>>>said
>>>> >>>>>>> >>>>tests (compare view to see diff available @ [3]).
>>>> >>>>>>> >>>>
>>>> >>>>>>> >>>> Bad news: we've been doing it wrong in our native
>>>> >>>>>>>implementations
>>>> >>>>>>>forÅ 
>>>> >>>>>>> >>>>well, ever, it seems.
>>>> >>>>>>> >>>>
>>>> >>>>>>> >>>> Moving forward would like to hear suggestions from
>>>>everyone.
>>>> >>>>>>> >>>>
>>>> >>>>>>> >>>> Breaking down what we didn't do in the past that the spec
>>>> >>>>>>>mandates:
>>>> >>>>>>> >>>>
>>>> >>>>>>> >>>>  *   Properly implementing a timeout. It is one of the
>>>> available
>>>> >>>>>>> >>>>options that you can pass into getCurrentPosition /
>>>> >>>>>>>watchPosition.
>>>> >>>>>>> >>>>However, we've been using it to date as essentially a
>>>> "frequency"
>>>> >>>>>>> >>>>parameter for watchPosition, I.e. "give me position
>>>>updates
>>>> every
>>>> >>>>>>> >>>><options.timeout> milliseconds". This is wrong. According
>>>>to
>>>> the
>>>> >>>>>>>spec,
>>>> >>>>>>> >>>>the timeout option defines how long after invoking a
>>>> >>>>>>>watch/getCurrent
>>>> >>>>>>> >>>>the error callback should wait before it fires with a
>>>>TIMEOUT
>>>> >>>>>>> >>>>PositionError object.
>>>> >>>>>>> >>>>  *   There is no control over how often watchPosition
>>>>should
>>>> >>>>>>>fire
>>>> >>>>>>> >>>>success callbacks. Instead, the spec says: "In step 5.2.2
>>>>of
>>>> the
>>>> >>>>>>>watch
>>>> >>>>>>> >>>>process, the successCallback is only invoked when a new
>>>> position
>>>> >>>>>>>is
>>>> >>>>>>> >>>>obtained and this position differs signifficantly from the
>>>> >>>>>>>previously
>>>> >>>>>>> >>>>reported position. The definition of what consitutes a
>>>> >>>>>>>significant
>>>> >>>>>>> >>>>difference is left to the implementation."
>>>> >>>>>>> >>>>  *   I've also added tests + control of comparing the
>>>> >>>>>>>"maximumAge"
>>>> >>>>>>> >>>>parameter on the JS side, and keeping a reference to the
>>>>last
>>>> >>>>>>> >>>>successful
>>>> >>>>>>> >>>>position retrieved from the native framework and comparing
>>>>its
>>>> >>>>>>> >>>>timestamp
>>>> >>>>>>> >>>>together with maximumAge. This should implement proper
>>>>caching
>>>> of
>>>> >>>>>>> >>>>positioning on the WebView side and hopefully save some
>>>>native
>>>> >>>>>>>round
>>>> >>>>>>> >>>>trips.
>>>> >>>>>>> >>>>
>>>> >>>>>>> >>>> All of this means the the API on the native side for
>>>> geolocation
>>>> >>>>>>>will
>>>> >>>>>>> >>>>change (sorry iOS!). Basically we have three actions that
>>>>the
>>>> >>>>>>> >>>>Geolocation plugin should listen for:
>>>> >>>>>>> >>>>
>>>> >>>>>>> >>>>  *   getLocation, which takes as parameters
>>>>enableHighAccuracy
>>>> >>>>>>> >>>>(boolean) and maximumAge (int as milliseconds).
>>>> >>>>>>> >>>>  *   addWatch, parameter: only the usual callbackID
>>>>required.
>>>> >>>>>>> >>>>  *   clearWatch, parameter: only the usual callbackID
>>>> required.
>>>> >>>>>>> >>>>
>>>> >>>>>>> >>>> getLocation should require very little changing (other
>>>>than
>>>> not
>>>> >>>>>>> >>>>needing
>>>> >>>>>>> >>>>the timeout parameter anymore, since that is handled on
>>>>the
>>>>JS
>>>> >>>>>>>side
>>>> >>>>>>>in
>>>> >>>>>>> >>>>my patch).
>>>> >>>>>>> >>>>
>>>> >>>>>>> >>>> addWatch should keep a list of callback Ids, and, as soon
>>>>as
>>>> we
>>>> >>>>>>>have
>>>> >>>>>>> >>>>one watch started, the native framework should start
>>>>watching
>>>> the
>>>> >>>>>>> >>>>position for a "significant position difference". Once
>>>>that
>>>> >>>>>>>happens, it
>>>> >>>>>>> >>>>should fire the success callback(s) for all stored watch
>>>> callback
>>>> >>>>>>>Ids.
>>>> >>>>>>> >>>>If there is an issue retrieving position, it should fire
>>>>the
>>>> >>>>>>>error
>>>> >>>>>>> >>>>callback(s) for all stored watch callback Ids.
>>>> >>>>>>> >>>>
>>>> >>>>>>> >>>> I commented out a bunch of iOS-specific code that already
>>>>did
>>>> a
>>>> >>>>>>> >>>>"distance filter" type of approach to position
>>>>acquisition,
>>>>but
>>>> >>>>>>>was
>>>> >>>>>>> >>>>only
>>>> >>>>>>> >>>>available if you provided undocumented parameters in the
>>>> options
>>>> >>>>>>> >>>>object.
>>>> >>>>>>> >>>>Not sure about how feasible a distance filter is in
>>>>Android, or
>>>> >>>>>>>Windows
>>>> >>>>>>> >>>>Phone, or our other supported platforms.
>>>> >>>>>>> >>>>
>>>> >>>>>>> >>>> One final point of discussion worth bringing up about
>>>>this
>>>> >>>>>>>issue.
>>>> >>>>>>> >>>>BlackBerry and Android use the default implementation of
>>>> >>>>>>>geolocation
>>>> >>>>>>> >>>>abilities in their respective WEbViews. Because of this I
>>>>would
>>>> >>>>>>>mandate
>>>> >>>>>>> >>>>removal of any Geolocation java code from the Android +
>>>> >>>>>>>BlackBerry
>>>> >>>>>>> >>>>implementations. Saves some bytes. Originally we had the
>>>> Android
>>>> >>>>>>>plugin
>>>> >>>>>>> >>>>classes in there for support for devices before 2.0. Since
>>>>we
>>>> are
>>>> >>>>>>>only
>>>> >>>>>>> >>>>supporting 2.0 and above, this is no longer needed. Are
>>>>there
>>>> any
>>>> >>>>>>> >>>>issues
>>>> >>>>>>> >>>>with this?
>>>> >>>>>>> >>>>
>>>> >>>>>>> >>>> Appreciate you guys looking this over.
>>>> >>>>>>> >>>>
>>>> >>>>>>> >>>> Cheers,
>>>> >>>>>>> >>>> Fil
>>>> >>>>>>> >>>>
>>>> >>>>>>> >>>> [1]
>>>> http://dev.w3.org/geo/api/spec-source.html#api_description
>>>> >>>>>>> >>>> [2] https://issues.apache.org/jira/browse/CB-359
>>>> >>>>>>> >>>> [3]
>>>> >>>>>>> >>>>
>>>> >>>>>>>
>>>> >>>>>>>
>>>> https://github.com/filmaj/incubator-cordova-js/compare/master...geotes
>>>> >>>>>>>t
>>>> >>>>>>> >>>>s
>>>> >>>>>>> >>
>>>> >>>>>>>
>>>> >>>>>>>
>>>> >>>>>
>>>> >>>>
>>>> >>
>>>>
>>
>

Reply via email to