Potentially Intent Spoofing

Description

The application is vulnerable to intent spoofing which could result in the access and exploitation of unauthorized components.

Recommendation

It is recommended to apply proper input validation and parameter filtering on intent action.

Technical details
[TAINT] String 'com.here.services.internal.LocationService' ==>>> Sink '['Landroid/content/Intent;', '<init>', '(Landroid/content/Context; Ljava/lang/Class;)V', '1', 'IPC_SINK']' [[('Lcom/here/b/a/a;', 'a', '(Lcom/here/b/a/a$e;)V'), ('Lcom/here/services/HereLocationApiClient;', 'connect', '()V'), ('Lcom/here/services/internal/CommonServiceController;', 'startServiceAndConnect', '()V'), ('Lcom/here/services/internal/ServiceUtil;', 'bindLocationService', '(Landroid/content/Context; Landroid/content/ServiceConnection; Landroid/os/Bundle;)Z'), ('Lcom/here/services/internal/ServiceUtil;', 'getServiceInfo', '(Landroid/content/Context;)Lcom/here/services/internal/ServiceUtil$ServiceInfo;'), ('Lcom/here/services/internal/ServiceUtil;', 'getSdkServiceInfo', '(Landroid/content/Context;)Lcom/here/services/internal/ServiceUtil$ServiceInfo;'), ('Landroid/content/Intent;', '<init>', '(Landroid/content/Context; Ljava/lang/Class;)V')]]

Use of a string value com.here.services.internal.LocationService to construct an Intent

Method com.here.b.a.a.a():


    public void a(com.here.b.a.a$e p8)
    {
        if (!this.o()) {
            if (android.os.Looper.myLooper() == null) {
                android.os.Looper.prepare();
            }
            com.here.services.HereLocationApiClient$Builder v1_0 = new com.here.services.HereLocationApiClient$Builder(this.c, "74d726afe570abe05ff57d42b4cf8ab6", this);
            v1_0.setSdkOptions(new com.here.services.HereLocationApiClient$SdkOptions(com.here.b.a.a.q()));
            v1_0.addApi(com.here.services.location.LocationServices.API);
            v1_0.addApi(com.here.services.test.LocationTestServices.API);
            v1_0.addApi(com.here.services.playback.MeasurementPlaybackServices.API);
            v1_0.addApi(com.here.services.positioning.analytics.UsageTrackingServices.API);
            if (com.here.b.a.a.j()) {
                v1_0.addApi(com.here.services.radiomap.RadioMapServices.API);
            }
            if ((com.here.b.a.a.i()) && (!this.c(this.c))) {
                String v0_13 = p8.a();
                if (v0_13 == null) {
                    v0_13 = com.nokia.maps.ApplicationContext.b().getAppId();
                    Object[] v4_0 = new Object[1];
                    v4_0[0] = v0_13;
                    com.nokia.maps.bp.a(com.here.b.a.a.a, "open: using app_id as customerId: %s", v4_0);
                } else {
                    Object[] v4_1 = new Object[1];
                    v4_1[0] = v0_13;
                    com.nokia.maps.bp.a(com.here.b.a.a.a, "open: using override customerId: %s", v4_1);
                }
                v1_0.setCustomerId(v0_13);
            }
            if (p8.b()) {
                String v3_2 = new Object[1];
                v3_2[0] = Boolean.valueOf(p8.b());
                com.nokia.maps.bp.a(com.here.b.a.a.a, "open: forcedOffline: %s", v3_2);
                v1_0.setOptions(new com.here.services.HereLocationApiClient$Options().setOfflineMode(1));
            }
            this.d = v1_0.build();
            this.e = com.here.b.a.a$f.b;
            this.d.connect();
        }
        return;
    }

Method com.here.services.HereLocationApiClient.connect():


    public void connect()
    {
        this.mCommonServiceController.startServiceAndConnect();
        return;
    }

Method com.here.services.internal.CommonServiceController.startServiceAndConnect():


    public declared_synchronized void startServiceAndConnect()
    {
        try {
            if (!this.isConnected()) {
                if (!this.mServices.isEmpty()) {
                    if (this.validatePermissions()) {
                        try {
                            if (!com.here.services.internal.ServiceUtil.bindLocationService(this.mContext, this.mConnection, this.getServiceOptions())) {
                                this.mCallbacks.onConnectionFailed(com.here.services.HereLocationApiClient$Reason.ServiceInitializationError);
                            }
                        } catch (com.here.services.HereLocationApiClient$ConnectionCallbacks v0) {
                            this.mCallbacks.onConnectionFailed(com.here.services.HereLocationApiClient$Reason.ServiceNotFound);
                        } catch (com.here.services.HereLocationApiClient$ConnectionCallbacks v0) {
                            this.mCallbacks.onConnectionFailed(com.here.services.HereLocationApiClient$Reason.PermissionDenied);
                        }
                    } else {
                        this.mCallbacks.onConnectionFailed(com.here.services.HereLocationApiClient$Reason.MissingPermissions);
                    }
                } else {
                    this.mCallbacks.onConnectionFailed(com.here.services.HereLocationApiClient$Reason.ServiceConfigurationError);
                }
            }
        } catch (com.here.services.HereLocationApiClient$ConnectionCallbacks v0_5) {
            throw v0_5;
        }
        return;
    }

Method com.here.services.internal.ServiceUtil.bindLocationService():


    public static boolean bindLocationService(android.content.Context p2, android.content.ServiceConnection p3, android.os.Bundle p4)
    {
        if (p3 != null) {
            boolean v0_3 = com.here.services.internal.ServiceUtil.getServiceInfo(p2);
            if (v0_3) {
                v0_3.putExtras(p4);
                return v0_3.bind(p3);
            } else {
                throw new com.here.services.internal.ServiceNotFoundException("service not found");
            }
        } else {
            throw new IllegalArgumentException("connection is null");
        }
    }

Method com.here.services.internal.ServiceUtil.getServiceInfo():


    public static com.here.services.internal.ServiceUtil$ServiceInfo getServiceInfo(android.content.Context p2)
    {
        if (p2 != null) {
            com.here.services.internal.ServiceNotFoundException v0_3 = com.here.services.internal.ServiceUtil.getSdkServiceInfo(p2);
            if (v0_3 == null) {
                v0_3 = com.here.services.internal.ServiceUtil.getOemServiceInfo(p2);
            }
            if (v0_3 != null) {
                return v0_3;
            } else {
                throw new com.here.services.internal.ServiceNotFoundException("service not found");
            }
        } else {
            throw new IllegalArgumentException("context is null");
        }
    }

Method com.here.services.internal.ServiceUtil.getSdkServiceInfo():


    private static com.here.services.internal.ServiceUtil$ServiceInfo getSdkServiceInfo(android.content.Context p4)
    {
        if (p4.getPackageManager().getServiceInfo(new android.content.ComponentName(p4, "com.here.services.internal.LocationService"), 0) != null) {
            android.content.Intent v1_0 = new android.content.Intent(p4, Class.forName("com.here.services.internal.LocationService"));
            v1_0.setAction("com.here.services.Controller");
            com.here.services.internal.ServiceUtil$ServiceInfo v0_5 = new com.here.services.internal.ServiceUtil$ServiceInfo(p4, v1_0, 1, 0);
        } else {
            throw new RuntimeException("getSdkServiceIntent: getServiceInfo returned null");
        }
        return v0_5;
    }

Method android.content.Intent.<init>() not found.

[TAINT] String 'com.here.services.internal.LocationService' ==>>> Sink '['Landroid/content/Intent;', '<init>', '(Landroid/content/Context; Ljava/lang/Class;)V', '1', 'IPC_SINK']' [[('Lcom/here/android/mpa/common/LocationDataSourceHERE;', 'getInstance', '(Lcom/here/android/positioning/StatusListener;)Lcom/here/android/mpa/common/LocationDataSourceHERE;'), ('Lcom/nokia/maps/bc;', '<init>', '(Landroid/content/Context; Lcom/here/android/positioning/StatusListener;)V'), ('Lcom/nokia/maps/bc;', 'a', '(Lcom/here/android/positioning/StatusListener;)V'), ('Lcom/here/b/a/a;', 'a', '(Lcom/here/b/a/a$e;)V'), ('Lcom/here/services/HereLocationApiClient;', 'connect', '()V'), ('Lcom/here/services/internal/CommonServiceController;', 'startServiceAndConnect', '()V'), ('Lcom/here/services/internal/ServiceUtil;', 'bindLocationService', '(Landroid/content/Context; Landroid/content/ServiceConnection; Landroid/os/Bundle;)Z'), ('Lcom/here/services/internal/ServiceUtil;', 'getServiceInfo', '(Landroid/content/Context;)Lcom/here/services/internal/ServiceUtil$ServiceInfo;'), ('Lcom/here/services/internal/ServiceUtil;', 'getSdkServiceInfo', '(Landroid/content/Context;)Lcom/here/services/internal/ServiceUtil$ServiceInfo;'), ('Landroid/content/Intent;', '<init>', '(Landroid/content/Context; Ljava/lang/Class;)V')]]

Use of a string value com.here.services.internal.LocationService to construct an Intent

Method com.here.android.mpa.common.LocationDataSourceHERE.getInstance():


    public static com.here.android.mpa.common.LocationDataSourceHERE getInstance(com.here.android.positioning.StatusListener p3)
    {
        com.nokia.maps.bc v0_3;
        if (com.here.b.a.a.f()) {
            if (com.here.android.mpa.common.LocationDataSourceHERE.b == null) {
                if (com.here.android.mpa.common.LocationDataSourceHERE.b == null) {
                    com.here.android.mpa.common.LocationDataSourceHERE.b = new com.nokia.maps.bc(com.nokia.maps.MapsEngine.f(), p3);
                }
            }
            v0_3 = com.here.android.mpa.common.LocationDataSourceHERE.b;
        } else {
            v0_3 = 0;
        }
        return v0_3;
    }

Method com.nokia.maps.bc.<init>():


    public bc(android.content.Context p4, com.here.android.positioning.StatusListener p5)
    {
        this.i = new android.os.HandlerThread("HereLocationTimedCallbacks");
        this.q = new com.nokia.maps.bc$1(this);
        this.r = new com.nokia.maps.bc$3(this);
        this.s = new com.nokia.maps.bc$4(this);
        this.t = new com.nokia.maps.bc$5(this);
        com.nokia.maps.bc.a(p5);
        this.i.start();
        this.d = p4;
        this.n = p5;
        if (android.os.Looper.myLooper() == null) {
            Object[] v2_1 = new Object[0];
            com.nokia.maps.bp.a(com.nokia.maps.bc.a, "myLooper is null, preparing", v2_1);
            android.os.Looper.prepare();
        }
        this.j = new android.os.Handler(this.i.getLooper());
        this.i();
        return;
    }

Method com.nokia.maps.bc.a():


    private static void a(com.here.android.positioning.StatusListener p5)
    {
        if (com.here.b.a.a.e()) {
            try {
                int v0_3 = com.nokia.maps.MapsEngine.d();
                com.nokia.maps.bc.p = com.here.b.a.a.a(com.nokia.maps.MapsEngine.f());
            } catch (int v0_1) {
                Object[] v3_1 = new Object[1];
                v3_1[0] = v0_1;
                com.nokia.maps.bp.c(com.nokia.maps.bc.a, "MapsEngine instance not available", v3_1);
                com.nokia.maps.bc.p = 0;
            }
            if (com.nokia.maps.bc.p != null) {
                v0_3.a(com.nokia.maps.bc.p);
                if (!com.nokia.maps.bc.p.a()) {
                    if (p5 != null) {
                        com.nokia.maps.bc.o = new com.nokia.maps.bc$9(p5);
                        com.nokia.maps.bc.p.a(com.nokia.maps.bc.o);
                    }
                    com.nokia.maps.bc.p.a(new com.nokia.maps.bc$10(v0_3));
                }
            }
        }
        return;
    }

Method com.here.b.a.a.a():


    public void a(com.here.b.a.a$e p8)
    {
        if (!this.o()) {
            if (android.os.Looper.myLooper() == null) {
                android.os.Looper.prepare();
            }
            com.here.services.HereLocationApiClient$Builder v1_0 = new com.here.services.HereLocationApiClient$Builder(this.c, "74d726afe570abe05ff57d42b4cf8ab6", this);
            v1_0.setSdkOptions(new com.here.services.HereLocationApiClient$SdkOptions(com.here.b.a.a.q()));
            v1_0.addApi(com.here.services.location.LocationServices.API);
            v1_0.addApi(com.here.services.test.LocationTestServices.API);
            v1_0.addApi(com.here.services.playback.MeasurementPlaybackServices.API);
            v1_0.addApi(com.here.services.positioning.analytics.UsageTrackingServices.API);
            if (com.here.b.a.a.j()) {
                v1_0.addApi(com.here.services.radiomap.RadioMapServices.API);
            }
            if ((com.here.b.a.a.i()) && (!this.c(this.c))) {
                String v0_13 = p8.a();
                if (v0_13 == null) {
                    v0_13 = com.nokia.maps.ApplicationContext.b().getAppId();
                    Object[] v4_0 = new Object[1];
                    v4_0[0] = v0_13;
                    com.nokia.maps.bp.a(com.here.b.a.a.a, "open: using app_id as customerId: %s", v4_0);
                } else {
                    Object[] v4_1 = new Object[1];
                    v4_1[0] = v0_13;
                    com.nokia.maps.bp.a(com.here.b.a.a.a, "open: using override customerId: %s", v4_1);
                }
                v1_0.setCustomerId(v0_13);
            }
            if (p8.b()) {
                String v3_2 = new Object[1];
                v3_2[0] = Boolean.valueOf(p8.b());
                com.nokia.maps.bp.a(com.here.b.a.a.a, "open: forcedOffline: %s", v3_2);
                v1_0.setOptions(new com.here.services.HereLocationApiClient$Options().setOfflineMode(1));
            }
            this.d = v1_0.build();
            this.e = com.here.b.a.a$f.b;
            this.d.connect();
        }
        return;
    }

Method com.here.services.HereLocationApiClient.connect():


    public void connect()
    {
        this.mCommonServiceController.startServiceAndConnect();
        return;
    }

Method com.here.services.internal.CommonServiceController.startServiceAndConnect():


    public declared_synchronized void startServiceAndConnect()
    {
        try {
            if (!this.isConnected()) {
                if (!this.mServices.isEmpty()) {
                    if (this.validatePermissions()) {
                        try {
                            if (!com.here.services.internal.ServiceUtil.bindLocationService(this.mContext, this.mConnection, this.getServiceOptions())) {
                                this.mCallbacks.onConnectionFailed(com.here.services.HereLocationApiClient$Reason.ServiceInitializationError);
                            }
                        } catch (com.here.services.HereLocationApiClient$ConnectionCallbacks v0) {
                            this.mCallbacks.onConnectionFailed(com.here.services.HereLocationApiClient$Reason.ServiceNotFound);
                        } catch (com.here.services.HereLocationApiClient$ConnectionCallbacks v0) {
                            this.mCallbacks.onConnectionFailed(com.here.services.HereLocationApiClient$Reason.PermissionDenied);
                        }
                    } else {
                        this.mCallbacks.onConnectionFailed(com.here.services.HereLocationApiClient$Reason.MissingPermissions);
                    }
                } else {
                    this.mCallbacks.onConnectionFailed(com.here.services.HereLocationApiClient$Reason.ServiceConfigurationError);
                }
            }
        } catch (com.here.services.HereLocationApiClient$ConnectionCallbacks v0_5) {
            throw v0_5;
        }
        return;
    }

Method com.here.services.internal.ServiceUtil.bindLocationService():


    public static boolean bindLocationService(android.content.Context p2, android.content.ServiceConnection p3, android.os.Bundle p4)
    {
        if (p3 != null) {
            boolean v0_3 = com.here.services.internal.ServiceUtil.getServiceInfo(p2);
            if (v0_3) {
                v0_3.putExtras(p4);
                return v0_3.bind(p3);
            } else {
                throw new com.here.services.internal.ServiceNotFoundException("service not found");
            }
        } else {
            throw new IllegalArgumentException("connection is null");
        }
    }

Method com.here.services.internal.ServiceUtil.getServiceInfo():


    public static com.here.services.internal.ServiceUtil$ServiceInfo getServiceInfo(android.content.Context p2)
    {
        if (p2 != null) {
            com.here.services.internal.ServiceNotFoundException v0_3 = com.here.services.internal.ServiceUtil.getSdkServiceInfo(p2);
            if (v0_3 == null) {
                v0_3 = com.here.services.internal.ServiceUtil.getOemServiceInfo(p2);
            }
            if (v0_3 != null) {
                return v0_3;
            } else {
                throw new com.here.services.internal.ServiceNotFoundException("service not found");
            }
        } else {
            throw new IllegalArgumentException("context is null");
        }
    }

Method com.here.services.internal.ServiceUtil.getSdkServiceInfo():


    private static com.here.services.internal.ServiceUtil$ServiceInfo getSdkServiceInfo(android.content.Context p4)
    {
        if (p4.getPackageManager().getServiceInfo(new android.content.ComponentName(p4, "com.here.services.internal.LocationService"), 0) != null) {
            android.content.Intent v1_0 = new android.content.Intent(p4, Class.forName("com.here.services.internal.LocationService"));
            v1_0.setAction("com.here.services.Controller");
            com.here.services.internal.ServiceUtil$ServiceInfo v0_5 = new com.here.services.internal.ServiceUtil$ServiceInfo(p4, v1_0, 1, 0);
        } else {
            throw new RuntimeException("getSdkServiceIntent: getServiceInfo returned null");
        }
        return v0_5;
    }

Method android.content.Intent.<init>() not found.

[TAINT] String 'com.here.services.internal.LocationService' ==>>> Sink '['Landroid/content/Intent;', '<init>', '(Landroid/content/Context; Ljava/lang/Class;)V', '1', 'IPC_SINK']' [[('Lcom/here/android/mpa/common/LocationDataSourceHERE;', 'getInstance', '()Lcom/here/android/mpa/common/LocationDataSourceHERE;'), ('Lcom/here/android/mpa/common/LocationDataSourceHERE;', 'getInstance', '(Lcom/here/android/positioning/StatusListener;)Lcom/here/android/mpa/common/LocationDataSourceHERE;'), ('Lcom/nokia/maps/bc;', '<init>', '(Landroid/content/Context; Lcom/here/android/positioning/StatusListener;)V'), ('Lcom/nokia/maps/bc;', 'a', '(Lcom/here/android/positioning/StatusListener;)V'), ('Lcom/here/b/a/a;', 'a', '(Lcom/here/b/a/a$e;)V'), ('Lcom/here/services/HereLocationApiClient;', 'connect', '()V'), ('Lcom/here/services/internal/CommonServiceController;', 'startServiceAndConnect', '()V'), ('Lcom/here/services/internal/ServiceUtil;', 'bindLocationService', '(Landroid/content/Context; Landroid/content/ServiceConnection; Landroid/os/Bundle;)Z'), ('Lcom/here/services/internal/ServiceUtil;', 'getServiceInfo', '(Landroid/content/Context;)Lcom/here/services/internal/ServiceUtil$ServiceInfo;'), ('Lcom/here/services/internal/ServiceUtil;', 'getSdkServiceInfo', '(Landroid/content/Context;)Lcom/here/services/internal/ServiceUtil$ServiceInfo;'), ('Landroid/content/Intent;', '<init>', '(Landroid/content/Context; Ljava/lang/Class;)V')]]

Use of a string value com.here.services.internal.LocationService to construct an Intent

Method com.here.android.mpa.common.LocationDataSourceHERE.getInstance():


    public static com.here.android.mpa.common.LocationDataSourceHERE getInstance()
    {
        return com.here.android.mpa.common.LocationDataSourceHERE.getInstance(0);
    }

Method com.here.android.mpa.common.LocationDataSourceHERE.getInstance():


    public static com.here.android.mpa.common.LocationDataSourceHERE getInstance(com.here.android.positioning.StatusListener p3)
    {
        com.nokia.maps.bc v0_3;
        if (com.here.b.a.a.f()) {
            if (com.here.android.mpa.common.LocationDataSourceHERE.b == null) {
                if (com.here.android.mpa.common.LocationDataSourceHERE.b == null) {
                    com.here.android.mpa.common.LocationDataSourceHERE.b = new com.nokia.maps.bc(com.nokia.maps.MapsEngine.f(), p3);
                }
            }
            v0_3 = com.here.android.mpa.common.LocationDataSourceHERE.b;
        } else {
            v0_3 = 0;
        }
        return v0_3;
    }

Method com.nokia.maps.bc.<init>():


    public bc(android.content.Context p4, com.here.android.positioning.StatusListener p5)
    {
        this.i = new android.os.HandlerThread("HereLocationTimedCallbacks");
        this.q = new com.nokia.maps.bc$1(this);
        this.r = new com.nokia.maps.bc$3(this);
        this.s = new com.nokia.maps.bc$4(this);
        this.t = new com.nokia.maps.bc$5(this);
        com.nokia.maps.bc.a(p5);
        this.i.start();
        this.d = p4;
        this.n = p5;
        if (android.os.Looper.myLooper() == null) {
            Object[] v2_1 = new Object[0];
            com.nokia.maps.bp.a(com.nokia.maps.bc.a, "myLooper is null, preparing", v2_1);
            android.os.Looper.prepare();
        }
        this.j = new android.os.Handler(this.i.getLooper());
        this.i();
        return;
    }

Method com.nokia.maps.bc.a():


    private static void a(com.here.android.positioning.StatusListener p5)
    {
        if (com.here.b.a.a.e()) {
            try {
                int v0_3 = com.nokia.maps.MapsEngine.d();
                com.nokia.maps.bc.p = com.here.b.a.a.a(com.nokia.maps.MapsEngine.f());
            } catch (int v0_1) {
                Object[] v3_1 = new Object[1];
                v3_1[0] = v0_1;
                com.nokia.maps.bp.c(com.nokia.maps.bc.a, "MapsEngine instance not available", v3_1);
                com.nokia.maps.bc.p = 0;
            }
            if (com.nokia.maps.bc.p != null) {
                v0_3.a(com.nokia.maps.bc.p);
                if (!com.nokia.maps.bc.p.a()) {
                    if (p5 != null) {
                        com.nokia.maps.bc.o = new com.nokia.maps.bc$9(p5);
                        com.nokia.maps.bc.p.a(com.nokia.maps.bc.o);
                    }
                    com.nokia.maps.bc.p.a(new com.nokia.maps.bc$10(v0_3));
                }
            }
        }
        return;
    }

Method com.here.b.a.a.a():


    public void a(com.here.b.a.a$e p8)
    {
        if (!this.o()) {
            if (android.os.Looper.myLooper() == null) {
                android.os.Looper.prepare();
            }
            com.here.services.HereLocationApiClient$Builder v1_0 = new com.here.services.HereLocationApiClient$Builder(this.c, "74d726afe570abe05ff57d42b4cf8ab6", this);
            v1_0.setSdkOptions(new com.here.services.HereLocationApiClient$SdkOptions(com.here.b.a.a.q()));
            v1_0.addApi(com.here.services.location.LocationServices.API);
            v1_0.addApi(com.here.services.test.LocationTestServices.API);
            v1_0.addApi(com.here.services.playback.MeasurementPlaybackServices.API);
            v1_0.addApi(com.here.services.positioning.analytics.UsageTrackingServices.API);
            if (com.here.b.a.a.j()) {
                v1_0.addApi(com.here.services.radiomap.RadioMapServices.API);
            }
            if ((com.here.b.a.a.i()) && (!this.c(this.c))) {
                String v0_13 = p8.a();
                if (v0_13 == null) {
                    v0_13 = com.nokia.maps.ApplicationContext.b().getAppId();
                    Object[] v4_0 = new Object[1];
                    v4_0[0] = v0_13;
                    com.nokia.maps.bp.a(com.here.b.a.a.a, "open: using app_id as customerId: %s", v4_0);
                } else {
                    Object[] v4_1 = new Object[1];
                    v4_1[0] = v0_13;
                    com.nokia.maps.bp.a(com.here.b.a.a.a, "open: using override customerId: %s", v4_1);
                }
                v1_0.setCustomerId(v0_13);
            }
            if (p8.b()) {
                String v3_2 = new Object[1];
                v3_2[0] = Boolean.valueOf(p8.b());
                com.nokia.maps.bp.a(com.here.b.a.a.a, "open: forcedOffline: %s", v3_2);
                v1_0.setOptions(new com.here.services.HereLocationApiClient$Options().setOfflineMode(1));
            }
            this.d = v1_0.build();
            this.e = com.here.b.a.a$f.b;
            this.d.connect();
        }
        return;
    }

Method com.here.services.HereLocationApiClient.connect():


    public void connect()
    {
        this.mCommonServiceController.startServiceAndConnect();
        return;
    }

Method com.here.services.internal.CommonServiceController.startServiceAndConnect():


    public declared_synchronized void startServiceAndConnect()
    {
        try {
            if (!this.isConnected()) {
                if (!this.mServices.isEmpty()) {
                    if (this.validatePermissions()) {
                        try {
                            if (!com.here.services.internal.ServiceUtil.bindLocationService(this.mContext, this.mConnection, this.getServiceOptions())) {
                                this.mCallbacks.onConnectionFailed(com.here.services.HereLocationApiClient$Reason.ServiceInitializationError);
                            }
                        } catch (com.here.services.HereLocationApiClient$ConnectionCallbacks v0) {
                            this.mCallbacks.onConnectionFailed(com.here.services.HereLocationApiClient$Reason.ServiceNotFound);
                        } catch (com.here.services.HereLocationApiClient$ConnectionCallbacks v0) {
                            this.mCallbacks.onConnectionFailed(com.here.services.HereLocationApiClient$Reason.PermissionDenied);
                        }
                    } else {
                        this.mCallbacks.onConnectionFailed(com.here.services.HereLocationApiClient$Reason.MissingPermissions);
                    }
                } else {
                    this.mCallbacks.onConnectionFailed(com.here.services.HereLocationApiClient$Reason.ServiceConfigurationError);
                }
            }
        } catch (com.here.services.HereLocationApiClient$ConnectionCallbacks v0_5) {
            throw v0_5;
        }
        return;
    }

Method com.here.services.internal.ServiceUtil.bindLocationService():


    public static boolean bindLocationService(android.content.Context p2, android.content.ServiceConnection p3, android.os.Bundle p4)
    {
        if (p3 != null) {
            boolean v0_3 = com.here.services.internal.ServiceUtil.getServiceInfo(p2);
            if (v0_3) {
                v0_3.putExtras(p4);
                return v0_3.bind(p3);
            } else {
                throw new com.here.services.internal.ServiceNotFoundException("service not found");
            }
        } else {
            throw new IllegalArgumentException("connection is null");
        }
    }

Method com.here.services.internal.ServiceUtil.getServiceInfo():


    public static com.here.services.internal.ServiceUtil$ServiceInfo getServiceInfo(android.content.Context p2)
    {
        if (p2 != null) {
            com.here.services.internal.ServiceNotFoundException v0_3 = com.here.services.internal.ServiceUtil.getSdkServiceInfo(p2);
            if (v0_3 == null) {
                v0_3 = com.here.services.internal.ServiceUtil.getOemServiceInfo(p2);
            }
            if (v0_3 != null) {
                return v0_3;
            } else {
                throw new com.here.services.internal.ServiceNotFoundException("service not found");
            }
        } else {
            throw new IllegalArgumentException("context is null");
        }
    }

Method com.here.services.internal.ServiceUtil.getSdkServiceInfo():


    private static com.here.services.internal.ServiceUtil$ServiceInfo getSdkServiceInfo(android.content.Context p4)
    {
        if (p4.getPackageManager().getServiceInfo(new android.content.ComponentName(p4, "com.here.services.internal.LocationService"), 0) != null) {
            android.content.Intent v1_0 = new android.content.Intent(p4, Class.forName("com.here.services.internal.LocationService"));
            v1_0.setAction("com.here.services.Controller");
            com.here.services.internal.ServiceUtil$ServiceInfo v0_5 = new com.here.services.internal.ServiceUtil$ServiceInfo(p4, v1_0, 1, 0);
        } else {
            throw new RuntimeException("getSdkServiceIntent: getServiceInfo returned null");
        }
        return v0_5;
    }

Method android.content.Intent.<init>() not found.