Snap for 11816316 from 965da3df32 to 24Q3-release

Change-Id: Iedfe0a5abcdef2e999f20c1a94f62c6872816876
This commit is contained in:
Android Build Coastguard Worker
2024-05-08 23:22:09 +00:00
28 changed files with 292 additions and 92 deletions

View File

@@ -20,6 +20,7 @@ message BatteryOptimizeHistoricalLogEntry {
RESTORE = 4; RESTORE = 4;
BACKUP = 5; BACKUP = 5;
FORCE_RESET = 6; FORCE_RESET = 6;
EXTERNAL_UPDATE = 7;
} }
optional string package_name = 1; optional string package_name = 1;

View File

@@ -18,11 +18,10 @@ package com.android.settings.datausage.lib
import android.content.Context import android.content.Context
import android.net.NetworkTemplate import android.net.NetworkTemplate
import android.text.format.DateUtils
import android.util.Range import android.util.Range
import com.android.settings.datausage.lib.NetworkCycleDataRepository.Companion.asFourWeeks
import com.android.settings.datausage.lib.NetworkCycleDataRepository.Companion.bucketRange import com.android.settings.datausage.lib.NetworkCycleDataRepository.Companion.bucketRange
import com.android.settings.datausage.lib.NetworkCycleDataRepository.Companion.getCycles import com.android.settings.datausage.lib.NetworkCycleDataRepository.Companion.getCycles
import com.android.settings.datausage.lib.NetworkCycleDataRepository.Companion.reverseBucketRange
import com.android.settings.datausage.lib.NetworkStatsRepository.Companion.Bucket import com.android.settings.datausage.lib.NetworkStatsRepository.Companion.Bucket
import com.android.settings.datausage.lib.NetworkStatsRepository.Companion.aggregate import com.android.settings.datausage.lib.NetworkStatsRepository.Companion.aggregate
import com.android.settings.datausage.lib.NetworkStatsRepository.Companion.filterTime import com.android.settings.datausage.lib.NetworkStatsRepository.Companion.filterTime
@@ -39,16 +38,11 @@ class NetworkCycleBucketRepository(
getCycles().map { aggregateUsage(it) }.filter { it.usage > 0 } getCycles().map { aggregateUsage(it) }.filter { it.usage > 0 }
private fun getCycles(): List<Range<Long>> = private fun getCycles(): List<Range<Long>> =
networkCycleDataRepository.getPolicy()?.getCycles() ?: queryCyclesAsFourWeeks() networkCycleDataRepository.getPolicy()?.getCycles().orEmpty()
.ifEmpty { queryCyclesAsFourWeeks() }
private fun queryCyclesAsFourWeeks(): List<Range<Long>> { private fun queryCyclesAsFourWeeks(): List<Range<Long>> =
val timeRange = buckets.aggregate()?.timeRange ?: return emptyList() buckets.aggregate()?.timeRange.asFourWeeks()
return reverseBucketRange(
startTime = timeRange.lower,
endTime = timeRange.upper,
step = DateUtils.WEEK_IN_MILLIS * 4,
)
}
fun queryChartData(usageData: NetworkUsageData) = NetworkCycleChartData( fun queryChartData(usageData: NetworkUsageData) = NetworkCycleChartData(
total = usageData, total = usageData,

View File

@@ -42,16 +42,10 @@ class NetworkCycleDataRepository(
fun loadFirstCycle(): NetworkUsageData? = getCycles().firstOrNull()?.let { queryUsage(it) } fun loadFirstCycle(): NetworkUsageData? = getCycles().firstOrNull()?.let { queryUsage(it) }
override fun getCycles(): List<Range<Long>> = override fun getCycles(): List<Range<Long>> =
getPolicy()?.getCycles() ?: queryCyclesAsFourWeeks() getPolicy()?.getCycles().orEmpty().ifEmpty { queryCyclesAsFourWeeks() }
private fun queryCyclesAsFourWeeks(): List<Range<Long>> { private fun queryCyclesAsFourWeeks(): List<Range<Long>> =
val timeRange = networkStatsRepository.getTimeRange() ?: return emptyList() networkStatsRepository.getTimeRange().asFourWeeks()
return reverseBucketRange(
startTime = timeRange.lower,
endTime = timeRange.upper,
step = DateUtils.WEEK_IN_MILLIS * 4,
)
}
override fun getPolicy(): NetworkPolicy? = override fun getPolicy(): NetworkPolicy? =
with(NetworkPolicyEditor(policyManager)) { with(NetworkPolicyEditor(policyManager)) {
@@ -59,7 +53,6 @@ class NetworkCycleDataRepository(
getPolicy(networkTemplate) getPolicy(networkTemplate)
} }
override fun queryUsage(range: Range<Long>) = NetworkUsageData( override fun queryUsage(range: Range<Long>) = NetworkUsageData(
startTime = range.lower, startTime = range.lower,
endTime = range.upper, endTime = range.upper,
@@ -71,6 +64,15 @@ class NetworkCycleDataRepository(
Range(it.lower.toInstant().toEpochMilli(), it.upper.toInstant().toEpochMilli()) Range(it.lower.toInstant().toEpochMilli(), it.upper.toInstant().toEpochMilli())
}.toList() }.toList()
fun Range<Long>?.asFourWeeks(): List<Range<Long>> {
val timeRange = this ?: return emptyList()
return reverseBucketRange(
startTime = timeRange.lower,
endTime = timeRange.upper,
step = DateUtils.WEEK_IN_MILLIS * 4,
)
}
fun bucketRange(startTime: Long, endTime: Long, step: Long): List<Range<Long>> = fun bucketRange(startTime: Long, endTime: Long, step: Long): List<Range<Long>> =
(startTime..endTime step step).zipWithNext(::Range) (startTime..endTime step step).zipWithNext(::Range)

View File

@@ -18,6 +18,7 @@ package com.android.settings.display;
import android.content.Context; import android.content.Context;
import android.content.res.Resources; import android.content.res.Resources;
import android.os.UserHandle;
import android.provider.Settings; import android.provider.Settings;
import android.util.Log; import android.util.Log;
@@ -79,7 +80,8 @@ public class EvenDimmerPreferenceController extends TogglePreferenceController {
} }
private boolean getEvenDimmerActivated() { private boolean getEvenDimmerActivated() {
return Settings.Secure.getFloat(mContext.getContentResolver(), return Settings.Secure.getFloatForUser(mContext.getContentResolver(),
Settings.Secure.EVEN_DIMMER_ACTIVATED, 0) == 1; Settings.Secure.EVEN_DIMMER_ACTIVATED,
/* def= */ 1.0f, UserHandle.USER_CURRENT) == 1.0f;
} }
} }

View File

@@ -17,6 +17,9 @@ package com.android.settings.network;
import static android.provider.SettingsSlicesContract.KEY_AIRPLANE_MODE; import static android.provider.SettingsSlicesContract.KEY_AIRPLANE_MODE;
import static com.android.settings.network.SatelliteWarningDialogActivity.EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG;
import static com.android.settings.network.SatelliteWarningDialogActivity.TYPE_IS_AIRPLANE_MODE;
import android.app.Activity; import android.app.Activity;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
@@ -25,6 +28,7 @@ import android.content.pm.PackageManager;
import android.net.Uri; import android.net.Uri;
import android.provider.SettingsSlicesContract; import android.provider.SettingsSlicesContract;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.util.Log;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
@@ -38,13 +42,20 @@ import com.android.settings.Utils;
import com.android.settings.core.TogglePreferenceController; import com.android.settings.core.TogglePreferenceController;
import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnDestroy; import com.android.settingslib.core.lifecycle.events.OnDestroy;
import com.android.settingslib.core.lifecycle.events.OnResume;
import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop; import com.android.settingslib.core.lifecycle.events.OnStop;
public class AirplaneModePreferenceController extends TogglePreferenceController import java.util.concurrent.ExecutionException;
implements LifecycleObserver, OnStart, OnStop, OnDestroy, import java.util.concurrent.Executors;
AirplaneModeEnabler.OnAirplaneModeChangedListener { import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicBoolean;
public class AirplaneModePreferenceController extends TogglePreferenceController
implements LifecycleObserver, OnStart, OnResume, OnStop, OnDestroy,
AirplaneModeEnabler.OnAirplaneModeChangedListener {
private static final String TAG = AirplaneModePreferenceController.class.getSimpleName();
public static final int REQUEST_CODE_EXIT_ECM = 1; public static final int REQUEST_CODE_EXIT_ECM = 1;
/** /**
@@ -60,12 +71,15 @@ public class AirplaneModePreferenceController extends TogglePreferenceController
private Fragment mFragment; private Fragment mFragment;
private AirplaneModeEnabler mAirplaneModeEnabler; private AirplaneModeEnabler mAirplaneModeEnabler;
private TwoStatePreference mAirplaneModePreference; private TwoStatePreference mAirplaneModePreference;
private SatelliteRepository mSatelliteRepository;
@VisibleForTesting
AtomicBoolean mIsSatelliteOn = new AtomicBoolean(false);
public AirplaneModePreferenceController(Context context, String key) { public AirplaneModePreferenceController(Context context, String key) {
super(context, key); super(context, key);
if (isAvailable(mContext)) { if (isAvailable(mContext)) {
mAirplaneModeEnabler = new AirplaneModeEnabler(mContext, this); mAirplaneModeEnabler = new AirplaneModeEnabler(mContext, this);
mSatelliteRepository = new SatelliteRepository(mContext);
} }
} }
@@ -80,18 +94,28 @@ public class AirplaneModePreferenceController extends TogglePreferenceController
@Override @Override
public boolean handlePreferenceTreeClick(Preference preference) { public boolean handlePreferenceTreeClick(Preference preference) {
if (KEY_AIRPLANE_MODE.equals(preference.getKey()) && isAvailable() if (KEY_AIRPLANE_MODE.equals(preference.getKey()) && isAvailable()) {
&& mAirplaneModeEnabler.isInEcmMode()) {
// In ECM mode launch ECM app dialog // In ECM mode launch ECM app dialog
if (mFragment != null) { if (mAirplaneModeEnabler.isInEcmMode()) {
mFragment.startActivityForResult( if (mFragment != null) {
new Intent(TelephonyManager.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null) mFragment.startActivityForResult(
.setPackage(Utils.PHONE_PACKAGE_NAME), new Intent(TelephonyManager.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null)
REQUEST_CODE_EXIT_ECM); .setPackage(Utils.PHONE_PACKAGE_NAME),
REQUEST_CODE_EXIT_ECM);
}
return true;
} }
return true;
}
if (mIsSatelliteOn.get()) {
mContext.startActivity(
new Intent(mContext, SatelliteWarningDialogActivity.class)
.putExtra(
EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG,
TYPE_IS_AIRPLANE_MODE)
);
return true;
}
}
return false; return false;
} }
@@ -134,6 +158,17 @@ public class AirplaneModePreferenceController extends TogglePreferenceController
} }
} }
@Override
public void onResume() {
try {
mIsSatelliteOn.set(
mSatelliteRepository.requestIsEnabled(Executors.newSingleThreadExecutor())
.get(2000, TimeUnit.MILLISECONDS));
} catch (ExecutionException | TimeoutException | InterruptedException e) {
Log.e(TAG, "Error to get satellite status : " + e);
}
}
@Override @Override
public void onStop() { public void onStop() {
if (isAvailable()) { if (isAvailable()) {
@@ -165,7 +200,7 @@ public class AirplaneModePreferenceController extends TogglePreferenceController
@Override @Override
public boolean setChecked(boolean isChecked) { public boolean setChecked(boolean isChecked) {
if (isChecked() == isChecked) { if (isChecked() == isChecked || mIsSatelliteOn.get()) {
return false; return false;
} }
if (isAvailable()) { if (isAvailable()) {

View File

@@ -91,7 +91,6 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
private AirplaneModeObserver mAirplaneModeObserver; private AirplaneModeObserver mAirplaneModeObserver;
private DataRoamingObserver mDataRoamingObserver; private DataRoamingObserver mDataRoamingObserver;
private MetricsFeatureProvider mMetricsFeatureProvider; private MetricsFeatureProvider mMetricsFeatureProvider;
private Map<Integer, MobileDataContentObserver> mDataContentObserverMap = new HashMap<>();
private int mPhysicalSlotIndex = SubscriptionManager.INVALID_SIM_SLOT_INDEX; private int mPhysicalSlotIndex = SubscriptionManager.INVALID_SIM_SLOT_INDEX;
private int mLogicalSlotIndex = SubscriptionManager.INVALID_SIM_SLOT_INDEX; private int mLogicalSlotIndex = SubscriptionManager.INVALID_SIM_SLOT_INDEX;
private int mCardState = UiccSlotInfo.CARD_STATE_INFO_ABSENT; private int mCardState = UiccSlotInfo.CARD_STATE_INFO_ABSENT;
@@ -210,6 +209,9 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
*/ */
public void addRegister(LifecycleOwner lifecycleOwner, public void addRegister(LifecycleOwner lifecycleOwner,
MobileNetworkCallback mobileNetworkCallback, int subId) { MobileNetworkCallback mobileNetworkCallback, int subId) {
if (DEBUG) {
Log.d(TAG, "addRegister by SUB ID " + subId);
}
if (sCallbacks.isEmpty()) { if (sCallbacks.isEmpty()) {
mSubscriptionManager.addOnSubscriptionsChangedListener(mContext.getMainExecutor(), mSubscriptionManager.addOnSubscriptionsChangedListener(mContext.getMainExecutor(),
this); this);
@@ -221,7 +223,6 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
observeAllUiccInfo(lifecycleOwner); observeAllUiccInfo(lifecycleOwner);
observeAllMobileNetworkInfo(lifecycleOwner); observeAllMobileNetworkInfo(lifecycleOwner);
if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
addRegisterBySubId(subId);
createTelephonyManagerBySubId(subId); createTelephonyManagerBySubId(subId);
mDataRoamingObserver.register(mContext, subId); mDataRoamingObserver.register(mContext, subId);
} }
@@ -230,21 +231,6 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
sendAvailableSubInfoCache(mobileNetworkCallback); sendAvailableSubInfoCache(mobileNetworkCallback);
} }
public void addRegisterBySubId(int subId) {
Log.d(TAG, "MobileDataContentObserver addRegisterBySubId: " + subId);
MobileDataContentObserver dataContentObserver = new MobileDataContentObserver(
new Handler(Looper.getMainLooper()));
dataContentObserver.setOnMobileDataChangedListener(() -> {
sExecutor.execute(() -> {
Log.d(TAG, "MobileDataContentObserver changed");
insertMobileNetworkInfo(mContext, subId,
getTelephonyManagerBySubId(mContext, subId));
});
});
dataContentObserver.register(mContext, subId);
mDataContentObserverMap.put(subId, dataContentObserver);
}
private void createTelephonyManagerBySubId(int subId) { private void createTelephonyManagerBySubId(int subId) {
if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID
|| mTelephonyCallbackMap.containsKey(subId)) { || mTelephonyCallbackMap.containsKey(subId)) {
@@ -254,7 +240,7 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
return; return;
} }
PhoneCallStateTelephonyCallback PhoneCallStateTelephonyCallback
telephonyCallback = new PhoneCallStateTelephonyCallback(); telephonyCallback = new PhoneCallStateTelephonyCallback(subId);
TelephonyManager telephonyManager = mContext.getSystemService( TelephonyManager telephonyManager = mContext.getSystemService(
TelephonyManager.class).createForSubscriptionId(subId); TelephonyManager.class).createForSubscriptionId(subId);
telephonyManager.registerTelephonyCallback(mContext.getMainExecutor(), telephonyManager.registerTelephonyCallback(mContext.getMainExecutor(),
@@ -293,10 +279,6 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
} }
} }
} }
if (mDataContentObserverMap.containsKey(subId)) {
mDataContentObserverMap.get(subId).unRegister(mContext);
mDataContentObserverMap.remove(subId);
}
} }
public void removeRegister(MobileNetworkCallback mobileNetworkCallback) { public void removeRegister(MobileNetworkCallback mobileNetworkCallback) {
@@ -307,10 +289,6 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
mSubscriptionManager.removeOnSubscriptionsChangedListener(this); mSubscriptionManager.removeOnSubscriptionsChangedListener(this);
mAirplaneModeObserver.unRegister(mContext); mAirplaneModeObserver.unRegister(mContext);
mDataRoamingObserver.unRegister(mContext); mDataRoamingObserver.unRegister(mContext);
mDataContentObserverMap.forEach((id, observer) -> {
observer.unRegister(mContext);
});
mDataContentObserverMap.clear();
mTelephonyManagerMap.forEach((id, manager) -> { mTelephonyManagerMap.forEach((id, manager) -> {
TelephonyCallback callback = mTelephonyCallbackMap.get(id); TelephonyCallback callback = mTelephonyCallbackMap.get(id);
@@ -763,7 +741,14 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
} }
private class PhoneCallStateTelephonyCallback extends TelephonyCallback implements private class PhoneCallStateTelephonyCallback extends TelephonyCallback implements
TelephonyCallback.CallStateListener { TelephonyCallback.CallStateListener,
TelephonyCallback.UserMobileDataStateListener {
private int mSubId;
public PhoneCallStateTelephonyCallback(int subId) {
mSubId = subId;
}
@Override @Override
public void onCallStateChanged(int state) { public void onCallStateChanged(int state) {
@@ -771,6 +756,15 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
callback.onCallStateChanged(state); callback.onCallStateChanged(state);
} }
} }
@Override
public void onUserMobileDataStateChanged(boolean enabled) {
Log.d(TAG, "onUserMobileDataStateChanged enabled " + enabled + " on SUB " + mSubId);
sExecutor.execute(() -> {
insertMobileNetworkInfo(mContext, mSubId,
getTelephonyManagerBySubId(mContext, mSubId));
});
}
} }
/** /**

View File

@@ -41,7 +41,7 @@ class SatelliteWarningDialogActivity : SpaDialogWindowTypeActivity() {
} }
override fun getDialogWindowType(): Int { override fun getDialogWindowType(): Int {
return WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW return WindowManager.LayoutParams.LAST_APPLICATION_WINDOW
} }
@Composable @Composable

View File

@@ -100,9 +100,6 @@ public abstract class DefaultSubscriptionController extends TelephonyBasePrefere
mMobileNetworkRepository.addRegister(mLifecycleOwner, this, mMobileNetworkRepository.addRegister(mLifecycleOwner, this,
SubscriptionManager.INVALID_SUBSCRIPTION_ID); SubscriptionManager.INVALID_SUBSCRIPTION_ID);
mMobileNetworkRepository.updateEntity(); mMobileNetworkRepository.updateEntity();
// Can not get default subId from database until get the callback, add register by subId
// later.
mMobileNetworkRepository.addRegisterBySubId(getDefaultSubscriptionId());
mDataSubscriptionChangedReceiver.registerReceiver(); mDataSubscriptionChangedReceiver.registerReceiver();
} }

View File

@@ -30,6 +30,7 @@ import com.android.settings.slices.SliceBuilderUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@Deprecated(forRemoval = true)
public class NfcPanel implements PanelContent { public class NfcPanel implements PanelContent {
private final Context mContext; private final Context mContext;

View File

@@ -77,7 +77,14 @@ public class PanelFeatureProviderImpl implements PanelFeatureProvider {
context.sendBroadcast(volumeIntent); context.sendBroadcast(volumeIntent);
return null; return null;
} else { } else {
return VolumePanel.create(context); if (Flags.slicesRetirement()) {
Intent volIntent = new Intent(Settings.ACTION_SOUND_SETTINGS);
volIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(volIntent);
return null;
} else {
return VolumePanel.create(context);
}
} }
} }

View File

@@ -57,7 +57,10 @@ import java.util.concurrent.FutureTask;
/** /**
* Panel data class for Volume settings. * Panel data class for Volume settings.
*
* @deprecated this is no longer used after V and will be removed.
*/ */
@Deprecated(forRemoval = true)
public class VolumePanel implements PanelContent, LifecycleObserver { public class VolumePanel implements PanelContent, LifecycleObserver {
private static final String TAG = "VolumePanel"; private static final String TAG = "VolumePanel";

View File

@@ -32,7 +32,10 @@ import java.util.List;
/** /**
* Panel data class for Wifi settings. * Panel data class for Wifi settings.
*
* @deprecated this is not used after V and will be removed.
*/ */
@Deprecated(forRemoval = true)
public class WifiPanel implements PanelContent { public class WifiPanel implements PanelContent {
private final Context mContext; private final Context mContext;

View File

@@ -385,6 +385,10 @@ public class SimSlotChangeHandler {
} }
private void startSimConfirmDialogActivity(int subId) { private void startSimConfirmDialogActivity(int subId) {
if (!isSuwFinished(mContext)) {
Log.d(TAG, "Still in SUW. Do nothing");
return;
}
if (!SubscriptionManager.isUsableSubscriptionId(subId)) { if (!SubscriptionManager.isUsableSubscriptionId(subId)) {
Log.i(TAG, "Unable to enable subscription due to invalid subscription ID."); Log.i(TAG, "Unable to enable subscription due to invalid subscription ID.");
return; return;

View File

@@ -16,6 +16,9 @@
package com.android.settings.wifi; package com.android.settings.wifi;
import static com.android.settings.network.SatelliteWarningDialogActivity.EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG;
import static com.android.settings.network.SatelliteWarningDialogActivity.TYPE_IS_WIFI;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
@@ -27,19 +30,26 @@ import android.net.wifi.SupplicantState;
import android.net.wifi.WifiInfo; import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.provider.Settings; import android.provider.Settings;
import android.util.Log;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.network.SatelliteRepository;
import com.android.settings.network.SatelliteWarningDialogActivity;
import com.android.settings.widget.SwitchWidgetController; import com.android.settings.widget.SwitchWidgetController;
import com.android.settingslib.WirelessUtils; import com.android.settingslib.WirelessUtils;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
public class WifiEnabler implements SwitchWidgetController.OnSwitchChangeListener { public class WifiEnabler implements SwitchWidgetController.OnSwitchChangeListener {
private static final String TAG = WifiEnabler.class.getSimpleName();
private final SwitchWidgetController mSwitchWidget; private final SwitchWidgetController mSwitchWidget;
private final WifiManager mWifiManager; private final WifiManager mWifiManager;
private final ConnectivityManager mConnectivityManager; private final ConnectivityManager mConnectivityManager;
@@ -48,7 +58,9 @@ public class WifiEnabler implements SwitchWidgetController.OnSwitchChangeListene
private Context mContext; private Context mContext;
private boolean mListeningToOnSwitchChange = false; private boolean mListeningToOnSwitchChange = false;
private AtomicBoolean mConnected = new AtomicBoolean(false); private AtomicBoolean mConnected = new AtomicBoolean(false);
private SatelliteRepository mSatelliteRepository;
@VisibleForTesting
AtomicBoolean mIsSatelliteOn = new AtomicBoolean(false);
private boolean mStateMachineEvent; private boolean mStateMachineEvent;
private final IntentFilter mIntentFilter; private final IntentFilter mIntentFilter;
@@ -93,7 +105,7 @@ public class WifiEnabler implements SwitchWidgetController.OnSwitchChangeListene
// The order matters! We really should not depend on this. :( // The order matters! We really should not depend on this. :(
mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
mSatelliteRepository = new SatelliteRepository(context);
setupSwitchController(); setupSwitchController();
} }
@@ -124,6 +136,14 @@ public class WifiEnabler implements SwitchWidgetController.OnSwitchChangeListene
mSwitchWidget.startListening(); mSwitchWidget.startListening();
mListeningToOnSwitchChange = true; mListeningToOnSwitchChange = true;
} }
// Refresh satellite mode status.
try {
mIsSatelliteOn.set(
mSatelliteRepository.requestIsEnabled(Executors.newSingleThreadExecutor())
.get(2000, TimeUnit.MILLISECONDS));
} catch (ExecutionException | TimeoutException | InterruptedException e) {
Log.e(TAG, "Error to get satellite status : " + e);
}
} }
public void pause() { public void pause() {
@@ -185,6 +205,18 @@ public class WifiEnabler implements SwitchWidgetController.OnSwitchChangeListene
if (mStateMachineEvent) { if (mStateMachineEvent) {
return true; return true;
} }
// Show dialog and do nothing under satellite mode.
if (mIsSatelliteOn.get()) {
mContext.startActivity(
new Intent(mContext, SatelliteWarningDialogActivity.class)
.putExtra(
EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG,
TYPE_IS_WIFI)
);
return false;
}
// Show toast message if Wi-Fi is not allowed in airplane mode // Show toast message if Wi-Fi is not allowed in airplane mode
if (isChecked && !WirelessUtils.isRadioAllowed(mContext, Settings.Global.RADIO_WIFI)) { if (isChecked && !WirelessUtils.isRadioAllowed(mContext, Settings.Global.RADIO_WIFI)) {
Toast.makeText(mContext, R.string.wifi_in_airplane_mode, Toast.LENGTH_SHORT).show(); Toast.makeText(mContext, R.string.wifi_in_airplane_mode, Toast.LENGTH_SHORT).show();

View File

@@ -32,7 +32,10 @@ import com.android.wifitrackerlib.WifiEntry.ConnectCallback;
/** /**
* This receiver helps connect to Wi-Fi network * This receiver helps connect to Wi-Fi network
*
* @deprecated this is not used after V and will be removed.
*/ */
@Deprecated(forRemoval = true)
public class ConnectToWifiHandler extends BroadcastReceiver { public class ConnectToWifiHandler extends BroadcastReceiver {
static final String KEY_CHOSEN_WIFIENTRY_KEY = "key_chosen_wifientry_key"; static final String KEY_CHOSEN_WIFIENTRY_KEY = "key_chosen_wifientry_key";

View File

@@ -39,7 +39,10 @@ import java.util.List;
/** /**
* {@link SliceBackgroundWorker} for Wi-Fi, used by {@link WifiSlice}. * {@link SliceBackgroundWorker} for Wi-Fi, used by {@link WifiSlice}.
*
* @deprecated this is not used after V and will be removed.
*/ */
@Deprecated(forRemoval = true)
public class WifiScanWorker extends SliceBackgroundWorker<WifiSliceItem> implements public class WifiScanWorker extends SliceBackgroundWorker<WifiSliceItem> implements
WifiPickerTracker.WifiPickerTrackerCallback, LifecycleOwner, WifiEntryCallback { WifiPickerTracker.WifiPickerTrackerCallback, LifecycleOwner, WifiEntryCallback {

View File

@@ -52,6 +52,7 @@ import com.android.settings.SubSettings;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.SubSettingLauncher;
import com.android.settings.network.NetworkProviderSettings; import com.android.settings.network.NetworkProviderSettings;
import com.android.settings.network.SatelliteRepository;
import com.android.settings.network.WifiSwitchPreferenceController; import com.android.settings.network.WifiSwitchPreferenceController;
import com.android.settings.slices.CustomSliceable; import com.android.settings.slices.CustomSliceable;
import com.android.settings.slices.SliceBackgroundWorker; import com.android.settings.slices.SliceBackgroundWorker;
@@ -66,11 +67,18 @@ import com.android.wifitrackerlib.WifiEntry;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
* {@link CustomSliceable} for Wi-Fi, used by generic clients. * {@link CustomSliceable} for Wi-Fi, used by generic clients.
*
* @deprecated This is not used after V and will be removed.
*/ */
@Deprecated(forRemoval = true)
public class WifiSlice implements CustomSliceable { public class WifiSlice implements CustomSliceable {
@VisibleForTesting @VisibleForTesting
@@ -225,7 +233,8 @@ public class WifiSlice implements CustomSliceable {
.setAccentColor(COLOR_NOT_TINTED) .setAccentColor(COLOR_NOT_TINTED)
.setKeywords(getKeywords()) .setKeywords(getKeywords())
.addRow(getHeaderRow(isWifiEnabled, wifiSliceItem)); .addRow(getHeaderRow(isWifiEnabled, wifiSliceItem));
if (!isWiFiPermissionGranted || !mWifiRestriction.isChangeWifiStateAllowed(mContext)) { if (!isWiFiPermissionGranted || !mWifiRestriction.isChangeWifiStateAllowed(mContext)
|| isSatelliteOn()) {
return builder; return builder;
} }
@@ -416,4 +425,17 @@ public class WifiSlice implements CustomSliceable {
return WifiEnterpriseRestrictionUtils.isChangeWifiStateAllowed(context); return WifiEnterpriseRestrictionUtils.isChangeWifiStateAllowed(context);
} }
} }
private boolean isSatelliteOn() {
SatelliteRepository satelliteRepository = new SatelliteRepository(mContext);
boolean isSatelliteOn = false;
try {
isSatelliteOn =
satelliteRepository.requestIsEnabled(Executors.newSingleThreadExecutor())
.get(2000, TimeUnit.MILLISECONDS);
} catch (ExecutionException | TimeoutException | InterruptedException e) {
Log.e(TAG, "Error to get satellite status : " + e);
}
return isSatelliteOn;
}
} }

View File

@@ -26,7 +26,10 @@ import com.android.wifitrackerlib.WifiEntry;
/** /**
* The data set which is needed by a Wi-Fi Slice, it collects necessary data from {@link WifiEntry} * The data set which is needed by a Wi-Fi Slice, it collects necessary data from {@link WifiEntry}
* and provides similar getter methods for corresponding data. * and provides similar getter methods for corresponding data.
*
* @deprecated this is not used after V and will be removed.
*/ */
@Deprecated(forRemoval = true)
public class WifiSliceItem { public class WifiSliceItem {
private final Context mContext; private final Context mContext;

View File

@@ -35,6 +35,7 @@ import org.robolectric.RuntimeEnvironment;
import java.util.List; import java.util.List;
@Deprecated(forRemoval = true)
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class VolumePanelTest { public class VolumePanelTest {

View File

@@ -18,12 +18,15 @@ package com.android.settings.wifi;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.content.Context; import android.content.Context;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.util.AndroidRuntimeException;
import com.android.settings.testutils.shadow.ShadowRestrictedLockUtilsInternal; import com.android.settings.testutils.shadow.ShadowRestrictedLockUtilsInternal;
import com.android.settings.widget.SwitchWidgetController; import com.android.settings.widget.SwitchWidgetController;
@@ -65,4 +68,17 @@ public class WifiEnablerTest {
assertThat(mEnabler.onSwitchToggled(true)).isTrue(); assertThat(mEnabler.onSwitchToggled(true)).isTrue();
} }
@Test
public void onSwitchToggled_satelliteOn_startWarningActivity() {
mEnabler.mIsSatelliteOn.set(true);
try {
mEnabler.onSwitchToggled(true);
} catch (AndroidRuntimeException e) {
// Catch exception of starting activity .
}
verify(mContext).startActivity(any());
}
} }

View File

@@ -48,6 +48,7 @@ import org.robolectric.RobolectricTestRunner;
import java.util.Arrays; import java.util.Arrays;
@Deprecated(forRemoval = true)
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class WifiScanWorkerTest { public class WifiScanWorkerTest {

View File

@@ -72,6 +72,7 @@ import org.robolectric.shadows.ShadowBinder;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@Deprecated(forRemoval = true)
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = { @Config(shadows = {
WifiSliceTest.ShadowSliceBackgroundWorker.class, WifiSliceTest.ShadowSliceBackgroundWorker.class,

View File

@@ -42,6 +42,13 @@ class NetworkCycleBucketRepositoryTest {
private val mockNetworkCycleDataRepository = mock<NetworkCycleDataRepository>() private val mockNetworkCycleDataRepository = mock<NetworkCycleDataRepository>()
private fun createRepository(buckets: List<Bucket>) = NetworkCycleBucketRepository(
context = context,
networkTemplate = template,
buckets = buckets,
networkCycleDataRepository = mockNetworkCycleDataRepository,
)
@Test @Test
fun loadCycles_byPolicy() { fun loadCycles_byPolicy() {
val policy = mock<NetworkPolicy> { val policy = mock<NetworkPolicy> {
@@ -52,9 +59,7 @@ class NetworkCycleBucketRepositoryTest {
mockNetworkCycleDataRepository.stub { mockNetworkCycleDataRepository.stub {
on { getPolicy() } doReturn policy on { getPolicy() } doReturn policy
} }
val repository = NetworkCycleBucketRepository( val repository = createRepository(
context = context,
networkTemplate = template,
buckets = listOf( buckets = listOf(
Bucket( Bucket(
uid = 0, uid = 0,
@@ -62,8 +67,7 @@ class NetworkCycleBucketRepositoryTest {
startTimeStamp = CYCLE1_START_TIME, startTimeStamp = CYCLE1_START_TIME,
endTimeStamp = CYCLE1_END_TIME, endTimeStamp = CYCLE1_END_TIME,
) )
), )
networkCycleDataRepository = mockNetworkCycleDataRepository,
) )
val cycles = repository.loadCycles() val cycles = repository.loadCycles()
@@ -78,13 +82,14 @@ class NetworkCycleBucketRepositoryTest {
} }
@Test @Test
fun loadCycles_asFourWeeks() { fun loadCycles_policyHasNoCycle_asFourWeeks() {
mockNetworkCycleDataRepository.stub { val policy = mock<NetworkPolicy> {
on { getPolicy() } doReturn null on { cycleIterator() } doReturn emptyList<Range<ZonedDateTime>>().iterator()
} }
val repository = NetworkCycleBucketRepository( mockNetworkCycleDataRepository.stub {
context = context, on { getPolicy() } doReturn policy
networkTemplate = template, }
val repository = createRepository(
buckets = listOf( buckets = listOf(
Bucket( Bucket(
uid = 0, uid = 0,
@@ -92,8 +97,34 @@ class NetworkCycleBucketRepositoryTest {
startTimeStamp = CYCLE2_START_TIME, startTimeStamp = CYCLE2_START_TIME,
endTimeStamp = CYCLE2_END_TIME, endTimeStamp = CYCLE2_END_TIME,
) )
)
)
val cycles = repository.loadCycles()
assertThat(cycles).containsExactly(
NetworkUsageData(
startTime = CYCLE2_END_TIME - DateUtils.WEEK_IN_MILLIS * 4,
endTime = CYCLE2_END_TIME,
usage = CYCLE2_BYTES,
), ),
networkCycleDataRepository = mockNetworkCycleDataRepository, )
}
@Test
fun loadCycles_noPolicy_asFourWeeks() {
mockNetworkCycleDataRepository.stub {
on { getPolicy() } doReturn null
}
val repository = createRepository(
buckets = listOf(
Bucket(
uid = 0,
bytes = CYCLE2_BYTES,
startTimeStamp = CYCLE2_START_TIME,
endTimeStamp = CYCLE2_END_TIME,
)
)
) )
val cycles = repository.loadCycles() val cycles = repository.loadCycles()
@@ -114,9 +145,7 @@ class NetworkCycleBucketRepositoryTest {
endTime = CYCLE4_END_TIME, endTime = CYCLE4_END_TIME,
usage = CYCLE3_BYTES + CYCLE4_BYTES, usage = CYCLE3_BYTES + CYCLE4_BYTES,
) )
val repository = NetworkCycleBucketRepository( val repository = createRepository(
context = context,
networkTemplate = template,
buckets = listOf( buckets = listOf(
Bucket( Bucket(
uid = 0, uid = 0,
@@ -131,7 +160,6 @@ class NetworkCycleBucketRepositoryTest {
endTimeStamp = CYCLE4_END_TIME, endTimeStamp = CYCLE4_END_TIME,
), ),
), ),
networkCycleDataRepository = mockNetworkCycleDataRepository,
) )
val summary = repository.queryChartData(cycle) val summary = repository.queryChartData(cycle)

View File

@@ -25,6 +25,7 @@ import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settings.testutils.zonedDateTime import com.android.settings.testutils.zonedDateTime
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import java.time.ZonedDateTime
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
@@ -77,7 +78,28 @@ class NetworkCycleDataRepositoryTest {
} }
@Test @Test
fun loadFirstCycle_asFourWeeks() = runTest { fun loadFirstCycle_policyHasNoCycle_asFourWeeks() = runTest {
val policy = mock<NetworkPolicy> {
on { cycleIterator() } doReturn emptyList<Range<ZonedDateTime>>().iterator()
}
doReturn(policy).whenever(repository).getPolicy()
mockNetworkStatsRepository.stub {
on { getTimeRange() } doReturn Range(CYCLE2_START_TIME, CYCLE2_END_TIME)
}
val firstCycle = repository.loadFirstCycle()
assertThat(firstCycle).isEqualTo(
NetworkUsageData(
startTime = CYCLE2_END_TIME - DateUtils.WEEK_IN_MILLIS * 4,
endTime = CYCLE2_END_TIME,
usage = CYCLE2_BYTES,
),
)
}
@Test
fun loadFirstCycle_noPolicy_asFourWeeks() = runTest {
doReturn(null).whenever(repository).getPolicy() doReturn(null).whenever(repository).getPolicy()
mockNetworkStatsRepository.stub { mockNetworkStatsRepository.stub {
on { getTimeRange() } doReturn Range(CYCLE2_START_TIME, CYCLE2_END_TIME) on { getTimeRange() } doReturn Range(CYCLE2_START_TIME, CYCLE2_END_TIME)

View File

@@ -16,10 +16,14 @@
package com.android.settings.network; package com.android.settings.network;
import static android.provider.SettingsSlicesContract.KEY_AIRPLANE_MODE;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.content.ContentResolver; import android.content.ContentResolver;
@@ -28,6 +32,7 @@ import android.content.pm.PackageManager;
import android.os.Looper; import android.os.Looper;
import android.provider.Settings; import android.provider.Settings;
import android.provider.SettingsSlicesContract; import android.provider.SettingsSlicesContract;
import android.util.AndroidRuntimeException;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
@@ -73,12 +78,12 @@ public class AirplaneModePreferenceControllerTest {
mResolver = mContext.getContentResolver(); mResolver = mContext.getContentResolver();
doReturn(mPackageManager).when(mContext).getPackageManager(); doReturn(mPackageManager).when(mContext).getPackageManager();
mController = new AirplaneModePreferenceController(mContext, mController = new AirplaneModePreferenceController(mContext,
SettingsSlicesContract.KEY_AIRPLANE_MODE); KEY_AIRPLANE_MODE);
mPreferenceManager = new PreferenceManager(mContext); mPreferenceManager = new PreferenceManager(mContext);
mScreen = mPreferenceManager.createPreferenceScreen(mContext); mScreen = mPreferenceManager.createPreferenceScreen(mContext);
mPreference = new RestrictedSwitchPreference(mContext); mPreference = new RestrictedSwitchPreference(mContext);
mPreference.setKey(SettingsSlicesContract.KEY_AIRPLANE_MODE); mPreference.setKey(KEY_AIRPLANE_MODE);
mScreen.addPreference(mPreference); mScreen.addPreference(mPreference);
mController.setFragment(null); mController.setFragment(null);
} }
@@ -167,4 +172,18 @@ public class AirplaneModePreferenceControllerTest {
public void isPublicSlice_returnsTrue() { public void isPublicSlice_returnsTrue() {
assertThat(mController.isPublicSlice()).isTrue(); assertThat(mController.isPublicSlice()).isTrue();
} }
@Test
public void handlePreferenceTreeClick_satelliteOn_startWarningActivity() {
mController.mIsSatelliteOn.set(true);
when(mAirplaneModeEnabler.isInEcmMode()).thenReturn(false);
try {
mController.handlePreferenceTreeClick(mPreference);
} catch (AndroidRuntimeException e) {
// Catch exception of starting activity .
}
verify(mContext).startActivity(any());
}
} }

View File

@@ -31,6 +31,7 @@ import org.junit.runner.RunWith;
import java.util.List; import java.util.List;
@Deprecated(forRemoval = true)
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
public class NfcPanelTest { public class NfcPanelTest {

View File

@@ -27,12 +27,15 @@ import static org.mockito.Mockito.verify;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.platform.test.annotations.DisableFlags;
import android.provider.Settings; import android.provider.Settings;
import android.util.FeatureFlagUtils; import android.util.FeatureFlagUtils;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settings.flags.Flags;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@@ -68,6 +71,7 @@ public class PanelFeatureProviderImplTest {
} }
@Test @Test
@DisableFlags(Flags.FLAG_SLICES_RETIREMENT)
public void getPanel_volumePanel_returnsCorrectPanel() { public void getPanel_volumePanel_returnsCorrectPanel() {
FeatureFlagUtils.setEnabled(mContext, FeatureFlagUtils.SETTINGS_VOLUME_PANEL_IN_SYSTEMUI, FeatureFlagUtils.setEnabled(mContext, FeatureFlagUtils.SETTINGS_VOLUME_PANEL_IN_SYSTEMUI,
false); false);

View File

@@ -31,6 +31,7 @@ import org.junit.runner.RunWith;
import java.util.List; import java.util.List;
@Deprecated(forRemoval = true)
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
public class WifiPanelTest { public class WifiPanelTest {