Files
packages_apps_Settings/src/com/android/settings/location/LocationSwitchBarController.java
Maggie 601054ce6a Fix switch bar in location settings
When user rotates the device in location settings, the swtich bar with
"Use Location" is gone. This change fixes the problem.

Also, remove override getInitialExpandedChildCount() in
LocationSettings. We will use nested PreferenceCategory instead once the
support is ready.

Bug: 73872033
Bug: 70843646
Test: Manual
Change-Id: I343b549398ef2b3d64ca7962b5f2a4ef0441c7f5
2018-03-02 14:16:59 -08:00

99 lines
3.8 KiB
Java

/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package com.android.settings.location;
import android.content.Context;
import android.os.UserHandle;
import android.widget.Switch;
import com.android.settings.widget.SwitchBar;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;
public class LocationSwitchBarController implements SwitchBar.OnSwitchChangeListener,
LocationEnabler.LocationModeChangeListener, LifecycleObserver, OnStart, OnStop {
private final SwitchBar mSwitchBar;
private final Switch mSwitch;
private final LocationEnabler mLocationEnabler;
private boolean mValidListener;
public LocationSwitchBarController(Context context, SwitchBar switchBar,
Lifecycle lifecycle) {
mSwitchBar = switchBar;
mSwitch = mSwitchBar.getSwitch();
mLocationEnabler = new LocationEnabler(context, this /* listener */, lifecycle);
if (lifecycle != null) {
lifecycle.addObserver(this);
}
}
@Override
public void onStart() {
if (!mValidListener) {
mSwitchBar.addOnSwitchChangeListener(this);
mValidListener = true;
}
}
@Override
public void onStop() {
if (mValidListener) {
mSwitchBar.removeOnSwitchChangeListener(this);
mValidListener = false;
}
}
@Override
public void onLocationModeChanged(int mode, boolean restricted) {
// Restricted user can't change the location mode, so disable the master switch. But in some
// corner cases, the location might still be enabled. In such case the master switch should
// be disabled but checked.
final boolean enabled = mLocationEnabler.isEnabled(mode);
final int userId = UserHandle.myUserId();
final RestrictedLockUtils.EnforcedAdmin admin =
mLocationEnabler.getShareLocationEnforcedAdmin(userId);
final boolean hasBaseUserRestriction =
mLocationEnabler.hasShareLocationRestriction(userId);
// Disable the whole switch bar instead of the switch itself. If we disabled the switch
// only, it would be re-enabled again if the switch bar is not disabled.
if (!hasBaseUserRestriction && admin != null) {
mSwitchBar.setDisabledByAdmin(admin);
} else {
mSwitchBar.setEnabled(!restricted);
}
if (enabled != mSwitch.isChecked()) {
// set listener to null so that that code below doesn't trigger onCheckedChanged()
if (mValidListener) {
mSwitchBar.removeOnSwitchChangeListener(this);
}
mSwitch.setChecked(enabled);
if (mValidListener) {
mSwitchBar.addOnSwitchChangeListener(this);
}
}
}
/**
* Listens to the state change of the location master switch.
*/
@Override
public void onSwitchChanged(Switch switchView, boolean isChecked) {
mLocationEnabler.setLocationEnabled(isChecked);
}
}