Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 22287fe7 authored by destradaa's avatar destradaa Committed by Android (Google) Code Review
Browse files

Merge "Fix race condition generating READY and NOT_SUPPORTED statuses."

parents e300553a 13a60b0d
Loading
Loading
Loading
Loading
+3 −3
Original line number Original line Diff line number Diff line
@@ -36,18 +36,18 @@ public class GpsNavigationMessageEvent implements Parcelable {
     * The system does not support tracking of GPS Navigation Messages. This status will not change
     * The system does not support tracking of GPS Navigation Messages. This status will not change
     * in the future.
     * in the future.
     */
     */
    public static int STATUS_NOT_SUPPORTED = 0;
    public static final int STATUS_NOT_SUPPORTED = 0;


    /**
    /**
     * GPS Navigation Messages are successfully being tracked, it will receive updates once they are
     * GPS Navigation Messages are successfully being tracked, it will receive updates once they are
     * available.
     * available.
     */
     */
    public static int STATUS_READY = 1;
    public static final int STATUS_READY = 1;


    /**
    /**
     * GPS provider or Location is disabled, updated will not be received until they are enabled.
     * GPS provider or Location is disabled, updated will not be received until they are enabled.
     */
     */
    public static int STATUS_GPS_LOCATION_DISABLED = 2;
    public static final int STATUS_GPS_LOCATION_DISABLED = 2;


    private final GpsNavigationMessage mNavigationMessage;
    private final GpsNavigationMessage mNavigationMessage;


+9 −8
Original line number Original line Diff line number Diff line
@@ -25,7 +25,6 @@ import com.android.internal.location.ProviderRequest;
import com.android.internal.R;
import com.android.internal.R;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.TelephonyIntents;


import android.app.AlarmManager;
import android.app.AlarmManager;
import android.app.AppOpsManager;
import android.app.AppOpsManager;
@@ -72,7 +71,6 @@ import android.provider.Settings;
import android.provider.Telephony.Carriers;
import android.provider.Telephony.Carriers;
import android.provider.Telephony.Sms.Intents;
import android.provider.Telephony.Sms.Intents;
import android.telephony.SmsMessage;
import android.telephony.SmsMessage;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.SubscriptionManager;
import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
import android.telephony.TelephonyManager;
import android.telephony.TelephonyManager;
@@ -91,7 +89,6 @@ import java.io.StringReader;
import java.net.InetAddress;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.Date;
import java.util.List;
import java.util.Map.Entry;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Properties;


@@ -395,7 +392,7 @@ public class GpsLocationProvider implements LocationProviderInterface {


    private final IGpsStatusProvider mGpsStatusProvider = new IGpsStatusProvider.Stub() {
    private final IGpsStatusProvider mGpsStatusProvider = new IGpsStatusProvider.Stub() {
        @Override
        @Override
        public void addGpsStatusListener(IGpsStatusListener listener) throws RemoteException {
        public void addGpsStatusListener(IGpsStatusListener listener) {
            mListenerHelper.addListener(listener);
            mListenerHelper.addListener(listener);
        }
        }


@@ -681,7 +678,7 @@ public class GpsLocationProvider implements LocationProviderInterface {
        mListenerHelper = new GpsStatusListenerHelper(mHandler) {
        mListenerHelper = new GpsStatusListenerHelper(mHandler) {
            @Override
            @Override
            protected boolean isAvailableInPlatform() {
            protected boolean isAvailableInPlatform() {
                return GpsLocationProvider.isSupported();
                return isSupported();
            }
            }


            @Override
            @Override
@@ -1027,6 +1024,9 @@ public class GpsLocationProvider implements LocationProviderInterface {
            if (mC2KServerHost != null) {
            if (mC2KServerHost != null) {
                native_set_agps_server(AGPS_TYPE_C2K, mC2KServerHost, mC2KServerPort);
                native_set_agps_server(AGPS_TYPE_C2K, mC2KServerHost, mC2KServerPort);
            }
            }

            mGpsMeasurementsProvider.onGpsEnabledChanged();
            mGpsNavigationMessageProvider.onGpsEnabledChanged();
        } else {
        } else {
            synchronized (mLock) {
            synchronized (mLock) {
                mEnabled = false;
                mEnabled = false;
@@ -1060,6 +1060,9 @@ public class GpsLocationProvider implements LocationProviderInterface {


        // do this before releasing wakelock
        // do this before releasing wakelock
        native_cleanup();
        native_cleanup();

        mGpsMeasurementsProvider.onGpsEnabledChanged();
        mGpsNavigationMessageProvider.onGpsEnabledChanged();
    }
    }


    @Override
    @Override
@@ -1479,9 +1482,7 @@ public class GpsLocationProvider implements LocationProviderInterface {
        }
        }


        if (wasNavigating != mNavigating) {
        if (wasNavigating != mNavigating) {
            mListenerHelper.onGpsEnabledChanged(mNavigating);
            mListenerHelper.onStatusChanged(mNavigating);
            mGpsMeasurementsProvider.onGpsEnabledChanged(mNavigating);
            mGpsNavigationMessageProvider.onGpsEnabledChanged(mNavigating);


            // send an intent to notify that the GPS has been enabled or disabled
            // send an intent to notify that the GPS has been enabled or disabled
            Intent intent = new Intent(LocationManager.GPS_ENABLED_CHANGE_ACTION);
            Intent intent = new Intent(LocationManager.GPS_ENABLED_CHANGE_ACTION);
+14 −15
Original line number Original line Diff line number Diff line
@@ -33,7 +33,7 @@ public abstract class GpsMeasurementsProvider
        extends RemoteListenerHelper<IGpsMeasurementsListener> {
        extends RemoteListenerHelper<IGpsMeasurementsListener> {
    private static final String TAG = "GpsMeasurementsProvider";
    private static final String TAG = "GpsMeasurementsProvider";


    public GpsMeasurementsProvider(Handler handler) {
    protected GpsMeasurementsProvider(Handler handler) {
        super(handler, TAG);
        super(handler, TAG);
    }
    }


@@ -49,15 +49,19 @@ public abstract class GpsMeasurementsProvider
    }
    }


    public void onCapabilitiesUpdated(boolean isGpsMeasurementsSupported) {
    public void onCapabilitiesUpdated(boolean isGpsMeasurementsSupported) {
        int status = isGpsMeasurementsSupported ?
        setSupported(isGpsMeasurementsSupported);
                GpsMeasurementsEvent.STATUS_READY :
        updateResult();
                GpsMeasurementsEvent.STATUS_NOT_SUPPORTED;
    }
        setSupported(isGpsMeasurementsSupported, new StatusChangedOperation(status));

    public void onGpsEnabledChanged() {
        if (tryUpdateRegistrationWithService()) {
            updateResult();
        }
    }
    }


    @Override
    @Override
    protected ListenerOperation<IGpsMeasurementsListener> getHandlerOperation(int result) {
    protected ListenerOperation<IGpsMeasurementsListener> getHandlerOperation(int result) {
        final int status;
        int status;
        switch (result) {
        switch (result) {
            case RESULT_SUCCESS:
            case RESULT_SUCCESS:
                status = GpsMeasurementsEvent.STATUS_READY;
                status = GpsMeasurementsEvent.STATUS_READY;
@@ -70,6 +74,8 @@ public abstract class GpsMeasurementsProvider
            case RESULT_GPS_LOCATION_DISABLED:
            case RESULT_GPS_LOCATION_DISABLED:
                status = GpsMeasurementsEvent.STATUS_GPS_LOCATION_DISABLED;
                status = GpsMeasurementsEvent.STATUS_GPS_LOCATION_DISABLED;
                break;
                break;
            case RESULT_UNKNOWN:
                return null;
            default:
            default:
                Log.v(TAG, "Unhandled addListener result: " + result);
                Log.v(TAG, "Unhandled addListener result: " + result);
                return null;
                return null;
@@ -77,15 +83,8 @@ public abstract class GpsMeasurementsProvider
        return new StatusChangedOperation(status);
        return new StatusChangedOperation(status);
    }
    }


    @Override
    private static class StatusChangedOperation
    protected void handleGpsEnabledChanged(boolean enabled) {
            implements ListenerOperation<IGpsMeasurementsListener> {
        int status = enabled ?
                GpsMeasurementsEvent.STATUS_READY :
                GpsMeasurementsEvent.STATUS_GPS_LOCATION_DISABLED;
        foreach(new StatusChangedOperation(status));
    }

    private class StatusChangedOperation implements ListenerOperation<IGpsMeasurementsListener> {
        private final int mStatus;
        private final int mStatus;


        public StatusChangedOperation(int status) {
        public StatusChangedOperation(int status) {
+13 −15
Original line number Original line Diff line number Diff line
@@ -33,7 +33,7 @@ public abstract class GpsNavigationMessageProvider
        extends RemoteListenerHelper<IGpsNavigationMessageListener> {
        extends RemoteListenerHelper<IGpsNavigationMessageListener> {
    private static final String TAG = "GpsNavigationMessageProvider";
    private static final String TAG = "GpsNavigationMessageProvider";


    public GpsNavigationMessageProvider(Handler handler) {
    protected GpsNavigationMessageProvider(Handler handler) {
        super(handler, TAG);
        super(handler, TAG);
    }
    }


@@ -50,15 +50,19 @@ public abstract class GpsNavigationMessageProvider
    }
    }


    public void onCapabilitiesUpdated(boolean isGpsNavigationMessageSupported) {
    public void onCapabilitiesUpdated(boolean isGpsNavigationMessageSupported) {
        int status = isGpsNavigationMessageSupported ?
        setSupported(isGpsNavigationMessageSupported);
                GpsNavigationMessageEvent.STATUS_READY :
        updateResult();
                GpsNavigationMessageEvent.STATUS_NOT_SUPPORTED;
    }
        setSupported(isGpsNavigationMessageSupported, new StatusChangedOperation(status));

    public void onGpsEnabledChanged() {
        if (tryUpdateRegistrationWithService()) {
            updateResult();
        }
    }
    }


    @Override
    @Override
    protected ListenerOperation<IGpsNavigationMessageListener> getHandlerOperation(int result) {
    protected ListenerOperation<IGpsNavigationMessageListener> getHandlerOperation(int result) {
        final int status;
        int status;
        switch (result) {
        switch (result) {
            case RESULT_SUCCESS:
            case RESULT_SUCCESS:
                status = GpsNavigationMessageEvent.STATUS_READY;
                status = GpsNavigationMessageEvent.STATUS_READY;
@@ -71,6 +75,8 @@ public abstract class GpsNavigationMessageProvider
            case RESULT_GPS_LOCATION_DISABLED:
            case RESULT_GPS_LOCATION_DISABLED:
                status = GpsNavigationMessageEvent.STATUS_GPS_LOCATION_DISABLED;
                status = GpsNavigationMessageEvent.STATUS_GPS_LOCATION_DISABLED;
                break;
                break;
            case RESULT_UNKNOWN:
                return null;
            default:
            default:
                Log.v(TAG, "Unhandled addListener result: " + result);
                Log.v(TAG, "Unhandled addListener result: " + result);
                return null;
                return null;
@@ -78,15 +84,7 @@ public abstract class GpsNavigationMessageProvider
        return new StatusChangedOperation(status);
        return new StatusChangedOperation(status);
    }
    }


    @Override
    private static class StatusChangedOperation
    protected void handleGpsEnabledChanged(boolean enabled) {
        int status = enabled ?
                GpsNavigationMessageEvent.STATUS_READY :
                GpsNavigationMessageEvent.STATUS_GPS_LOCATION_DISABLED;
        foreach(new StatusChangedOperation(status));
    }

    private class StatusChangedOperation
            implements ListenerOperation<IGpsNavigationMessageListener> {
            implements ListenerOperation<IGpsNavigationMessageListener> {
        private final int mStatus;
        private final int mStatus;


+5 −11
Original line number Original line Diff line number Diff line
@@ -24,14 +24,9 @@ import android.os.RemoteException;
 * Implementation of a handler for {@link IGpsStatusListener}.
 * Implementation of a handler for {@link IGpsStatusListener}.
 */
 */
abstract class GpsStatusListenerHelper extends RemoteListenerHelper<IGpsStatusListener> {
abstract class GpsStatusListenerHelper extends RemoteListenerHelper<IGpsStatusListener> {
    public GpsStatusListenerHelper(Handler handler) {
    protected GpsStatusListenerHelper(Handler handler) {
        super(handler, "GpsStatusListenerHelper");
        super(handler, "GpsStatusListenerHelper");

        setSupported(GpsLocationProvider.isSupported());
        Operation nullOperation = new Operation() {
            @Override
            public void execute(IGpsStatusListener iGpsStatusListener) throws RemoteException {}
        };
        setSupported(GpsLocationProvider.isSupported(), nullOperation);
    }
    }


    @Override
    @Override
@@ -47,10 +42,9 @@ abstract class GpsStatusListenerHelper extends RemoteListenerHelper<IGpsStatusLi
        return null;
        return null;
    }
    }


    @Override
    public void onStatusChanged(boolean isNavigating) {
    protected void handleGpsEnabledChanged(boolean enabled) {
        Operation operation;
        Operation operation;
        if (enabled) {
        if (isNavigating) {
            operation = new Operation() {
            operation = new Operation() {
                @Override
                @Override
                public void execute(IGpsStatusListener listener) throws RemoteException {
                public void execute(IGpsStatusListener listener) throws RemoteException {
@@ -114,5 +108,5 @@ abstract class GpsStatusListenerHelper extends RemoteListenerHelper<IGpsStatusLi
        foreach(operation);
        foreach(operation);
    }
    }


    private abstract class Operation implements ListenerOperation<IGpsStatusListener> { }
    private interface Operation extends ListenerOperation<IGpsStatusListener> {}
}
}
Loading