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

Commit eb582f7c authored by Yu-Han Yang's avatar Yu-Han Yang Committed by Android (Google) Code Review
Browse files

Merge "Avoid spamming native_set_position_mode by caching"

parents 26233c40 c8b9ff7b
Loading
Loading
Loading
Loading
+21 −2
Original line number Diff line number Diff line
@@ -387,6 +387,7 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt
    private long mLastFixTime;

    private int mPositionMode;
    private GnssPositionMode mLastPositionMode;

    // Current request from underlying location clients.
    private ProviderRequest mProviderRequest = null;
@@ -1341,7 +1342,7 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt
            // apply request to GPS engine
            if (mStarted && hasCapability(GPS_CAPABILITY_SCHEDULING)) {
                // change period and/or lowPowerMode
                if (!native_set_position_mode(mPositionMode, GPS_POSITION_RECURRENCE_PERIODIC,
                if (!setPositionMode(mPositionMode, GPS_POSITION_RECURRENCE_PERIODIC,
                        mFixInterval, 0, 0, mLowPowerMode)) {
                    Log.e(TAG, "set_position_mode failed in updateRequirements");
                }
@@ -1366,6 +1367,24 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt
        }
    }

    private boolean setPositionMode(int mode, int recurrence, int minInterval,
            int preferredAccuracy, int preferredTime, boolean lowPowerMode) {
        GnssPositionMode positionMode = new GnssPositionMode(mode, recurrence, minInterval,
                preferredAccuracy, preferredTime, lowPowerMode);
        if (mLastPositionMode != null && mLastPositionMode.equals(positionMode)) {
            return true;
        }

        boolean result = native_set_position_mode(mode, recurrence, minInterval,
                preferredAccuracy, preferredTime, lowPowerMode);
        if (result) {
            mLastPositionMode = positionMode;
        } else {
            mLastPositionMode = null;
        }
        return result;
    }

    private void updateClientUids(WorkSource source) {
        if (source.equals(mClientSource)) {
            return;
@@ -1525,7 +1544,7 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt

            int interval = (hasCapability(GPS_CAPABILITY_SCHEDULING) ? mFixInterval : 1000);
            mLowPowerMode = (boolean) mProviderRequest.lowPowerMode;
            if (!native_set_position_mode(mPositionMode, GPS_POSITION_RECURRENCE_PERIODIC,
            if (!setPositionMode(mPositionMode, GPS_POSITION_RECURRENCE_PERIODIC,
                    interval, 0, 0, mLowPowerMode)) {
                mStarted = false;
                Log.e(TAG, "set_position_mode failed in startNavigating()");
+46 −0
Original line number Diff line number Diff line
package com.android.server.location;

import java.util.Arrays;

/**
 * Represents a GNSS position mode.
 */
public class GnssPositionMode {
    private final int mode;
    private final int recurrence;
    private final int minInterval;
    private final int preferredAccuracy;
    private final int preferredTime;
    private final boolean lowPowerMode;

    public GnssPositionMode(int mode, int recurrence, int minInterval,
            int preferredAccuracy, int preferredTime, boolean lowPowerMode) {
        this.mode = mode;
        this.recurrence = recurrence;
        this.minInterval = minInterval;
        this.preferredAccuracy = preferredAccuracy;
        this.preferredTime = preferredTime;
        this.lowPowerMode = lowPowerMode;
    }

    @Override
    public boolean equals(Object other) {
        if (other instanceof GnssPositionMode) {
            GnssPositionMode that = (GnssPositionMode) other;
            return mode == that.mode && recurrence == that.recurrence
                    && minInterval == that.minInterval
                    && preferredAccuracy == that.preferredAccuracy
                    && preferredTime == that.preferredTime && lowPowerMode == that.lowPowerMode
                    && this.getClass() == that.getClass();
        }

        return false;
    }

    @Override
    public int hashCode() {
        return Arrays.hashCode(
                new Object[]{mode, recurrence, minInterval, preferredAccuracy, preferredTime,
                        lowPowerMode, getClass()});
    }
}
+61 −0
Original line number Diff line number Diff line
package com.android.server.location;

import static com.google.common.truth.Truth.assertThat;

import android.platform.test.annotations.Presubmit;

import com.android.server.testing.FrameworkRobolectricTestRunner;
import com.android.server.testing.SystemLoaderPackages;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;

import java.util.HashSet;

/**
 * Unit tests for {@link GnssPositionMode}.
 */
@RunWith(FrameworkRobolectricTestRunner.class)
@Config(
        manifest = Config.NONE,
        sdk = 27
)
@SystemLoaderPackages({"com.android.server.location"})
@Presubmit
public class GnssPositionModeTest {

    private GnssPositionMode positionMode1 = createGnssPositionMode(0, 1000);
    private GnssPositionMode positionMode2 = createGnssPositionMode(0, 1000);
    private GnssPositionMode positionMode3 = createGnssPositionMode(1, 1000);

    @Test
    public void testHashCode() {
        assertThat(positionMode1.hashCode()).isEqualTo(positionMode2.hashCode());
        assertThat(positionMode1.hashCode()).isNotEqualTo(positionMode3.hashCode());
        assertThat(positionMode1.hashCode()).isNotEqualTo(positionMode3.hashCode());

        HashSet<Integer> hashSet = new HashSet<>();
        hashSet.add(positionMode1.hashCode());
        hashSet.add(positionMode2.hashCode());
        assertThat(hashSet.size()).isEqualTo(1);
        hashSet.add(positionMode3.hashCode());
        assertThat(hashSet.size()).isEqualTo(2);
    }

    @Test
    public void checkIfEqualsImpliesSameHashCode() {
        assertTEqualsImpliesSameHashCode(positionMode1, positionMode2);
        assertTEqualsImpliesSameHashCode(positionMode2, positionMode3);
    }

    private void assertTEqualsImpliesSameHashCode(GnssPositionMode mode1, GnssPositionMode mode2) {
        if (mode1.equals(mode2)) {
            assertThat(mode1.hashCode()).isEqualTo(mode2.hashCode());
        }
    }

    private GnssPositionMode createGnssPositionMode(int mode, int minInterval) {
        return new GnssPositionMode(mode, 0, minInterval, 0, 0, true);
    }
}