Bug 1332434 - Add Baidu location support code (no libraries). r?snorp draft
authorMichael Kaply <mozilla@kaply.com>
Tue, 13 Jun 2017 15:43:20 -0500
changeset 593518 eb2967123deaa8706703b8494a3d3282cc37ce87
parent 593351 54d86b6724812751edb4561669fafda76503b149
child 633142 74b5270a311d35aafe98fce8ddc55ba89c34a858
push id63729
push usermozilla@kaply.com
push dateTue, 13 Jun 2017 20:47:56 +0000
reviewerssnorp
bugs1332434
milestone56.0a1
Bug 1332434 - Add Baidu location support code (no libraries). r?snorp MozReview-Commit-ID: 15VD6RLNQh6
mobile/android/base/AndroidManifest.xml.in
mobile/android/base/Makefile.in
mobile/android/base/moz.build
mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoAppShell.java
mobile/android/geckoview/src/main/java/org/mozilla/gecko/baidu/BaiduLocation.java
mobile/android/geckoview/src/main/java/org/mozilla/gecko/baidu/stub/BaiduLocation.java
mobile/android/thirdparty/baidu-geolocation-libs/manifests/BaiduLocationAndroidManifest_permissions.xml.in
mobile/android/thirdparty/baidu-geolocation-libs/manifests/BaiduLocationAndroidManifest_services.xml.in
--- a/mobile/android/base/AndroidManifest.xml.in
+++ b/mobile/android/base/AndroidManifest.xml.in
@@ -16,16 +16,19 @@
               android:targetSdkVersion="23"/>
 
 <!-- The bouncer APK and the main APK should define the same set of
      <permission>, <uses-permission>, and <uses-feature> elements.  This reduces
      the likelihood of permission-related surprises when installing the main APK
      on top of a pre-installed bouncer APK.  Add such shared elements in the
      fileincluded here, so that they can be referenced by both APKs. -->
 #include FennecManifest_permissions.xml.in
+#ifdef MOZ_ANDROID_MOZILLA_ONLINE
+#include ../thirdparty/baidu-geolocation-libs/manifests/BaiduLocationAndroidManifest_permissions.xml.in
+#endif
 
     <application android:label="@string/moz_app_displayname"
                  android:icon="@drawable/icon"
                  android:logo="@drawable/logo"
                  android:name="@MOZ_ANDROID_APPLICATION_CLASS@"
                  android:hardwareAccelerated="true"
                  android:supportsRtl="true"
                  android:allowBackup="false"
@@ -260,16 +263,19 @@
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
         </receiver>
 
 #include ../services/manifests/FxAccountAndroidManifest_activities.xml.in
 #ifdef MOZ_ANDROID_SEARCH_ACTIVITY
 #include ../search/manifests/SearchAndroidManifest_activities.xml.in
 #endif
+#ifdef MOZ_ANDROID_MOZILLA_ONLINE
+#include ../thirdparty/baidu-geolocation-libs/manifests/BaiduLocationAndroidManifest_services.xml.in
+#endif
 
 #ifdef MOZ_CRASHREPORTER
   <activity android:name="org.mozilla.gecko.CrashReporter"
             android:process="@ANDROID_PACKAGE_NAME@.CrashReporter"
             android:label="@string/crash_reporter_title"
             android:icon="@drawable/crash_reporter"
             android:theme="@style/Gecko"
             android:exported="false"
--- a/mobile/android/base/Makefile.in
+++ b/mobile/android/base/Makefile.in
@@ -157,16 +157,20 @@ endif
 ifdef MOZ_INSTALL_TRACKING
 GECKOVIEW_JARS += gecko-thirdparty-adjust_sdk.jar
 endif
 
 ifdef MOZ_ANDROID_MMA
 GECKOVIEW_JARS += gecko-thirdparty-leanplum_sdk.jar
 endif
 
+ifdef MOZ_ANDROID_MOZILLA_ONLINE
+GECKOVIEW_JARS += $(topsrcdir)/mobile/android/thirdparty/baidu-geolocation-libs/BaiduLBS_Android.jar
+endif
+
 geckoview_jars_classpath := $(subst $(NULL) ,:,$(strip $(GECKOVIEW_JARS)))
 
 FENNEC_JARS = \
   gecko-browser.jar \
   gecko-thirdparty.jar \
   services.jar \
   $(NULL)
 
--- a/mobile/android/base/moz.build
+++ b/mobile/android/base/moz.build
@@ -469,26 +469,38 @@ if CONFIG['MOZ_ANDROID_HLS_SUPPORT']:
         'media/GeckoHlsRendererBase.java',
         'media/GeckoHlsResourceWrapper.java',
         'media/GeckoHlsSample.java',
         'media/GeckoHlsVideoRenderer.java',
         'media/GeckoVideoInfo.java',
         'media/Utils.java',
     ]]
 
+if CONFIG['MOZ_ANDROID_MOZILLA_ONLINE']:
+    gvjar.sources += [geckoview_source_dir + 'java/org/mozilla/gecko/' + x for x in [
+        'baidu/BaiduLocation.java',
+    ]]
+else:
+    gvjar.sources += [geckoview_source_dir + 'java/org/mozilla/gecko/' + x for x in [
+        'baidu/stub/BaiduLocation.java',
+    ]]
 
 gvjar.extra_jars += [
     CONFIG['ANDROID_SUPPORT_ANNOTATIONS_JAR_LIB'],
     CONFIG['ANDROID_SUPPORT_V4_AAR_LIB'],
     CONFIG['ANDROID_SUPPORT_V4_AAR_INTERNAL_LIB'],
     'constants.jar',
     'gecko-mozglue.jar',
     'gecko-util.jar',
 ]
 
+if CONFIG['MOZ_ANDROID_MOZILLA_ONLINE']:
+    gvjar.extra_jars.append(thirdparty_source_dir + 'baidu-geolocation-libs/BaiduLBS_Android.jar')
+    gvjar.extra_jars.sort
+
 gvjar.javac_flags += [
     '-Xlint:all,-deprecation,-fallthrough',
     '-J-Xmx512m',
     '-J-Xms128m'
 ]
 
 
 gbjar = add_java_jar('gecko-browser')
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoAppShell.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoAppShell.java
@@ -19,16 +19,17 @@ import java.net.URLConnection;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.StringTokenizer;
 import java.util.TreeMap;
 
+import org.mozilla.gecko.BaiduLocation;
 import org.mozilla.gecko.annotation.JNITarget;
 import org.mozilla.gecko.annotation.RobocopTarget;
 import org.mozilla.gecko.annotation.WrapForJNI;
 import org.mozilla.gecko.gfx.BitmapUtils;
 import org.mozilla.gecko.gfx.LayerView;
 import org.mozilla.gecko.permissions.Permissions;
 import org.mozilla.gecko.process.GeckoProcessManager;
 import org.mozilla.gecko.util.HardwareCodecCapabilityUtils;
@@ -327,16 +328,25 @@ public class GeckoAppShell
                     } catch (final SecurityException e) {
                         Log.e(LOGTAG, "No location permission", e);
                     }
                 }
             });
             return;
         }
 
+        if (AppConstants.MOZ_ANDROID_MOZILLA_ONLINE) {
+            // Use Baidu location client instead.
+            if (enable) {
+                BaiduLocation.start();
+            }
+            // Is there a way to stop the Baidu location client?
+            return;
+        }
+
         LocationManager lm = getLocationManager(getApplicationContext());
         if (lm == null) {
             return;
         }
 
         if (!enable) {
             lm.removeUpdates(getLocationListener());
             return;
new file mode 100644
--- /dev/null
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/baidu/BaiduLocation.java
@@ -0,0 +1,68 @@
+package org.mozilla.gecko;
+
+import java.util.Date;
+
+import org.mozilla.gecko.GeckoAppShell;
+
+import android.location.Location;
+
+import com.baidu.location.BDLocation;
+import com.baidu.location.BDLocationListener;
+import com.baidu.location.LocationClient;
+import com.baidu.location.LocationClientOption;
+import com.baidu.location.Poi;
+
+public class BaiduLocation
+{
+        //Add for baidu geolocation
+    public static LocationClient mLocationClient = null;
+
+    public static void start() {
+        if (mLocationClient != null) {
+            mLocationClient.requestLocation();
+            return;
+        }
+        final String BAIDU_PROVIDER = "BAIDU_GEOLOCATION";
+        mLocationClient = new LocationClient(GeckoAppShell.getApplicationContext());     //声明LocationClient类
+        LocationClientOption option = new LocationClientOption();
+        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); //可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
+        option.setCoorType("gcj02"); //可选,默认gcj02,设置返回的定位结果坐标系
+        int span = 5000;
+        option.setScanSpan(span); //可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
+        option.setIsNeedAddress(true); //可选,设置是否需要地址信息,默认不需要
+        option.setOpenGps(true); //可选,默认false,设置是否使用gps
+        option.setLocationNotify(true); //可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果
+        option.setIsNeedLocationDescribe(true); //可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
+        option.setIsNeedLocationPoiList(true); //可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
+        option.setIgnoreKillProcess(false); //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
+        option.SetIgnoreCacheException(false); //可选,默认false,设置是否收集CRASH信息,默认收集
+        option.setEnableSimulateGps(false); //可选,默认false,设置是否需要过滤GPS仿真结果,默认需要
+        mLocationClient.setLocOption(option);
+        // Register the listener
+        mLocationClient.registerLocationListener(new BDLocationListener() {
+          @Override
+          public void onReceiveLocation(BDLocation location) {
+            if (location == null) {
+              return;
+            }
+            // Baidu to Google location interfaces
+            Location mLocation = new Location(BAIDU_PROVIDER);
+            mLocation.setLatitude(location.getLatitude());
+            mLocation.setLongitude(location.getLongitude());
+            Date today = new Date();
+            mLocation.setTime(today.getTime());
+            if (location.getLocType() == BDLocation.TypeGpsLocation) { // GPS定位结果
+                mLocation.setSpeed(location.getSpeed());
+            }
+            if (location.hasRadius()) {
+                mLocation.setAccuracy(location.getRadius());
+            }
+            GeckoAppShell.getLocationListener().onLocationChanged(mLocation);
+          }
+          @Override
+          public void onConnectHotSpotMessage(String s, int i) {
+          }
+        });
+        mLocationClient.start();
+    }
+}
new file mode 100644
--- /dev/null
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/baidu/stub/BaiduLocation.java
@@ -0,0 +1,8 @@
+package org.mozilla.gecko;
+
+public class BaiduLocation
+{
+    public static void start() {
+        return;
+    }
+}
new file mode 100644
--- /dev/null
+++ b/mobile/android/thirdparty/baidu-geolocation-libs/manifests/BaiduLocationAndroidManifest_permissions.xml.in
@@ -0,0 +1,18 @@
+<!-- 这个权限用于进行网络定位-->
+<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
+<!-- 这个权限用于访问GPS定位-->
+<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
+<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
+<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
+<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
+<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
+<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
+<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
+<!-- 用于读取手机当前的状态-->
+<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
+<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
+<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
+<!-- 访问网络,网络定位需要上网-->
+<uses-permission android:name="android.permission.INTERNET" />
+<!-- SD卡读取权限,用户写入离线定位数据-->
+<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
new file mode 100644
--- /dev/null
+++ b/mobile/android/thirdparty/baidu-geolocation-libs/manifests/BaiduLocationAndroidManifest_services.xml.in
@@ -0,0 +1,7 @@
+   <meta-data
+            android:name="com.baidu.lbsapi.API_KEY"
+            android:value="hdimaCqjMxWndBpxmP00Vdcqg2O57igm"/>
+   <service android:name="com.baidu.location.f"
+            android:enabled="true"
+            android:process=":remote">
+   </service>