1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CONTENT_BROWSER_GEOLOCATION_LOCATION_API_ADAPTER_ANDROID_H_ 6#define CONTENT_BROWSER_GEOLOCATION_LOCATION_API_ADAPTER_ANDROID_H_ 7 8#include "base/android/jni_weak_ref.h" 9#include "base/android/scoped_java_ref.h" 10#include "base/memory/ref_counted.h" 11#include "base/memory/singleton.h" 12#include "base/message_loop/message_loop_proxy.h" 13#include "base/synchronization/lock.h" 14 15namespace content { 16class LocationProviderAndroid; 17struct Geoposition; 18 19// Interacts with JNI and reports back to AndroidLocationProvider. 20// This class creates a LocationProvider java object and listens for 21// updates. 22// The simplified flow is: 23// GeolocationProvider runs in a Geolocation Thread and fetches geolocation data 24// from a LocationProvider. 25// AndroidLocationProvider access a singleton AndroidLocationApiAdapter 26// AndroidLocationApiAdapter calls via JNI and uses the main thread Looper 27// in the java side to listen for location updates. We then bounce these updates 28// to the Geolocation thread. 29// Note that AndroidLocationApiAdapter is a singleton and there's at most only 30// one AndroidLocationProvider that has called Start(). 31class AndroidLocationApiAdapter { 32 public: 33 // Starts the underlying location provider, returns true if successful. 34 // Called on the Geolocation thread. 35 bool Start(LocationProviderAndroid* location_provider, bool high_accuracy); 36 // Stops the underlying location provider. 37 // Called on the Geolocation thread. 38 void Stop(); 39 40 // Returns our singleton. 41 static AndroidLocationApiAdapter* GetInstance(); 42 43 // Called when initializing chrome_view to obtain a pointer to the java class. 44 static bool RegisterGeolocationService(JNIEnv* env); 45 46 // Called by JNI on main thread looper. 47 static void OnNewLocationAvailable(double latitude, 48 double longitude, 49 double time_stamp, 50 bool has_altitude, double altitude, 51 bool has_accuracy, double accuracy, 52 bool has_heading, double heading, 53 bool has_speed, double speed); 54 static void OnNewErrorAvailable(JNIEnv* env, jstring message); 55 56 private: 57 friend struct DefaultSingletonTraits<AndroidLocationApiAdapter>; 58 AndroidLocationApiAdapter(); 59 ~AndroidLocationApiAdapter(); 60 61 void CreateJavaObject(JNIEnv* env); 62 63 // Called on the JNI main thread looper. 64 void OnNewGeopositionInternal(const Geoposition& geoposition); 65 66 /// Called on the Geolocation thread. 67 static void NotifyProviderNewGeoposition(const Geoposition& geoposition); 68 69 base::android::ScopedJavaGlobalRef<jobject> 70 java_location_provider_android_object_; 71 LocationProviderAndroid* location_provider_; 72 73 // Guards against the following member which is accessed on Geolocation 74 // thread and the JNI main thread looper. 75 base::Lock lock_; 76 scoped_refptr<base::MessageLoopProxy> message_loop_; 77}; 78 79} // namespace content 80 81#endif // CONTENT_BROWSER_GEOLOCATION_LOCATION_API_ADAPTER_ANDROID_H_ 82