Remove broadcast of NETWORK_SET_TIMEZONE intent

android.intent.action.NETWORK_SET_TIMEZONE is not used by anything in
the platform so it can be removed. It was previously broadcast when
telephony made a time zone change, presumably as a way to coordinate
time zone detection logic if there were other, lower-priority detection
mechanisms on the device. The logic for time zone detection is now
centralized in the system server so coordination can be done more
directly when needed.

All the APK usages appear to be only manifest entries for
<protected-broadcast> in apps that don't send the intent themselves,
which doesn't make a lot of sense.

Note: There is a separate commit to remove the broadcast from the old
(disabled) NITZ logic.

Bug: 140712361
Test: treehugger
Change-Id: Iab629778e45815f4632359e90d920b7751c1a199
This commit is contained in:
Neil Fuller
2019-12-05 13:05:57 +00:00
parent 8e708ff380
commit 9a81291281
5 changed files with 18 additions and 92 deletions

View File

@@ -633,10 +633,9 @@
<protected-broadcast android:name="android.intent.action.DEVICE_CUSTOMIZATION_READY" />
<!-- NETWORK_SET_TIME / NETWORK_SET_TIMEZONE moved from com.android.phone to system server.
They should ultimately be removed. -->
<!-- NETWORK_SET_TIME moved from com.android.phone to system server. It should ultimately be
removed. -->
<protected-broadcast android:name="android.intent.action.NETWORK_SET_TIME" />
<protected-broadcast android:name="android.intent.action.NETWORK_SET_TIMEZONE" />
<!-- For tether entitlement recheck-->
<protected-broadcast

View File

@@ -20,13 +20,9 @@ import android.annotation.Nullable;
import android.app.AlarmManager;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.provider.Settings;
import com.android.internal.telephony.TelephonyIntents;
/**
* The real implementation of {@link TimeZoneDetectorStrategy.Callback}.
*/
@@ -66,16 +62,8 @@ public final class TimeZoneDetectorCallbackImpl implements TimeZoneDetectorStrat
}
@Override
public void setDeviceTimeZone(String zoneId, boolean sendNetworkBroadcast) {
public void setDeviceTimeZone(String zoneId) {
AlarmManager alarmManager = mContext.getSystemService(AlarmManager.class);
alarmManager.setTimeZone(zoneId);
if (sendNetworkBroadcast) {
// TODO Nothing in the platform appears to listen for this. Remove it.
Intent intent = new Intent(TelephonyIntents.ACTION_NETWORK_SET_TIMEZONE);
intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
intent.putExtra("time-zone", zoneId);
mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
}
}
}

View File

@@ -86,7 +86,7 @@ public class TimeZoneDetectorStrategy {
/**
* Sets the device's time zone.
*/
void setDeviceTimeZone(@NonNull String zoneId, boolean sendNetworkBroadcast);
void setDeviceTimeZone(@NonNull String zoneId);
}
private static final String LOG_TAG = "TimeZoneDetectorStrategy";
@@ -333,7 +333,6 @@ public class TimeZoneDetectorStrategy {
Objects.requireNonNull(newZoneId);
Objects.requireNonNull(cause);
boolean sendNetworkBroadcast = (origin == ORIGIN_PHONE);
boolean isOriginAutomatic = isOriginAutomatic(origin);
if (isOriginAutomatic) {
if (!mCallback.isAutoTimeZoneDetectionEnabled()) {
@@ -373,12 +372,11 @@ public class TimeZoneDetectorStrategy {
return;
}
mCallback.setDeviceTimeZone(newZoneId, sendNetworkBroadcast);
mCallback.setDeviceTimeZone(newZoneId);
String msg = "Set device time zone."
+ " origin=" + origin
+ ", currentZoneId=" + currentZoneId
+ ", newZoneId=" + newZoneId
+ ", sendNetworkBroadcast" + sendNetworkBroadcast
+ ", cause=" + cause;
if (DBG) {
Slog.d(LOG_TAG, msg);

View File

@@ -50,7 +50,6 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Objects;
/**
* White-box unit tests for {@link TimeZoneDetectorStrategy}.
@@ -445,8 +444,7 @@ public class TimeZoneDetectorStrategyTest {
static class FakeTimeZoneDetectorStrategyCallback implements TimeZoneDetectorStrategy.Callback {
private boolean mAutoTimeZoneDetectionEnabled;
private TestState<TimeZoneChange> mTimeZoneChanges = new TestState<>();
private String mTimeZoneId;
private TestState<String> mTimeZoneId = new TestState<>();
@Override
public boolean isAutoTimeZoneDetectionEnabled() {
@@ -460,13 +458,12 @@ public class TimeZoneDetectorStrategyTest {
@Override
public String getDeviceTimeZone() {
return mTimeZoneId;
return mTimeZoneId.getLatest();
}
@Override
public void setDeviceTimeZone(String zoneId, boolean withNetworkBroadcast) {
mTimeZoneId = zoneId;
mTimeZoneChanges.set(new TimeZoneChange(zoneId, withNetworkBroadcast));
public void setDeviceTimeZone(String zoneId) {
mTimeZoneId.set(zoneId);
}
void initializeAutoTimeZoneDetection(boolean enabled) {
@@ -474,7 +471,7 @@ public class TimeZoneDetectorStrategyTest {
}
void initializeTimeZone(String zoneId) {
mTimeZoneId = zoneId;
mTimeZoneId.init(zoneId);
}
void setAutoTimeZoneDetectionEnabled(boolean enabled) {
@@ -482,46 +479,17 @@ public class TimeZoneDetectorStrategyTest {
}
void assertTimeZoneNotSet() {
mTimeZoneChanges.assertHasNotBeenSet();
mTimeZoneId.assertHasNotBeenSet();
}
void assertTimeZoneSet(String timeZoneId, boolean withNetworkBroadcast) {
mTimeZoneChanges.assertHasBeenSet();
mTimeZoneChanges.assertChangeCount(1);
TimeZoneChange expectedChange = new TimeZoneChange(timeZoneId, withNetworkBroadcast);
mTimeZoneChanges.assertLatestEquals(expectedChange);
void assertTimeZoneSet(String timeZoneId) {
mTimeZoneId.assertHasBeenSet();
mTimeZoneId.assertChangeCount(1);
mTimeZoneId.assertLatestEquals(timeZoneId);
}
void commitAllChanges() {
mTimeZoneChanges.commitLatest();
}
}
private static class TimeZoneChange {
private final String mTimeZoneId;
private final boolean mWithNetworkBroadcast;
private TimeZoneChange(String timeZoneId, boolean withNetworkBroadcast) {
mTimeZoneId = timeZoneId;
mWithNetworkBroadcast = withNetworkBroadcast;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
TimeZoneChange that = (TimeZoneChange) o;
return mWithNetworkBroadcast == that.mWithNetworkBroadcast
&& mTimeZoneId.equals(that.mTimeZoneId);
}
@Override
public int hashCode() {
return Objects.hash(mTimeZoneId, mWithNetworkBroadcast);
mTimeZoneId.commitLatest();
}
}
@@ -614,21 +582,13 @@ public class TimeZoneDetectorStrategyTest {
}
Script verifyTimeZoneSetAndReset(PhoneTimeZoneSuggestion suggestion) {
// Phone suggestions should cause a TelephonyIntents.ACTION_NETWORK_SET_TIMEZONE
// broadcast.
boolean withNetworkBroadcast = true;
mFakeTimeZoneDetectorStrategyCallback.assertTimeZoneSet(
suggestion.getZoneId(), withNetworkBroadcast);
mFakeTimeZoneDetectorStrategyCallback.assertTimeZoneSet(suggestion.getZoneId());
mFakeTimeZoneDetectorStrategyCallback.commitAllChanges();
return this;
}
Script verifyTimeZoneSetAndReset(ManualTimeZoneSuggestion suggestion) {
// Manual suggestions should not cause a TelephonyIntents.ACTION_NETWORK_SET_TIMEZONE
// broadcast.
boolean withNetworkBroadcast = false;
mFakeTimeZoneDetectorStrategyCallback.assertTimeZoneSet(
suggestion.getZoneId(), withNetworkBroadcast);
mFakeTimeZoneDetectorStrategyCallback.assertTimeZoneSet(suggestion.getZoneId());
mFakeTimeZoneDetectorStrategyCallback.commitAllChanges();
return this;
}

View File

@@ -240,25 +240,6 @@ public class TelephonyIntents {
*/
public static final String ACTION_NETWORK_SET_TIME = "android.intent.action.NETWORK_SET_TIME";
/**
* Broadcast Action: The timezone was set by the carrier (typically by the NITZ string).
* This is a sticky broadcast.
* The intent will have the following extra values:</p>
* <ul>
* <li><em>time-zone</em> - The java.util.TimeZone.getID() value identifying the new time
* zone.</li>
* </ul>
*
* <p class="note">
* Requires the READ_PHONE_STATE permission.
*
* <p class="note">This is a protected intent that can only be sent
* by the system.
*/
public static final String ACTION_NETWORK_SET_TIMEZONE
= "android.intent.action.NETWORK_SET_TIMEZONE";
/**
* <p>Broadcast Action: It indicates the Emergency callback mode blocks datacall/sms
* <p class="note">.