Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / content / browser / geolocation / location_api_adapter_android.h
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
15 namespace content {
16 class LocationProviderAndroid;
17 struct 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().
31 class 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_