| /* |
| * 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); |
| } |
| } |