/* * Copyright (C) 2018 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.car.settings.accounts; import android.car.drivingstate.CarUxRestrictions; import android.content.ContentResolver; import android.content.Context; import android.os.UserHandle; import androidx.annotation.VisibleForTesting; import androidx.preference.TwoStatePreference; import com.android.car.settings.R; import com.android.car.settings.common.ConfirmationDialogFragment; import com.android.car.settings.common.FragmentController; import com.android.car.settings.common.PreferenceController; /** * Controller for the preference that allows the user to toggle automatic syncing of accounts. * *

Copied from {@link com.android.settings.users.AutoSyncDataPreferenceController} */ public class AccountAutoSyncPreferenceController extends PreferenceController { private final UserHandle mUserHandle; /** * Argument key to store a value that indicates whether the account auto sync is being enabled * or disabled. */ @VisibleForTesting static final String KEY_ENABLING = "ENABLING"; /** Argument key to store user handle. */ @VisibleForTesting static final String KEY_USER_HANDLE = "USER_HANDLE"; @VisibleForTesting final ConfirmationDialogFragment.ConfirmListener mConfirmListener = arguments -> { boolean enabling = arguments.getBoolean(KEY_ENABLING); UserHandle userHandle = arguments.getParcelable(KEY_USER_HANDLE); ContentResolver.setMasterSyncAutomaticallyAsUser(enabling, userHandle.getIdentifier()); getPreference().setChecked(enabling); }; public AccountAutoSyncPreferenceController(Context context, String preferenceKey, FragmentController fragmentController, CarUxRestrictions uxRestrictions) { super(context, preferenceKey, fragmentController, uxRestrictions); mUserHandle = UserHandle.of(UserHandle.myUserId()); } @Override protected Class getPreferenceType() { return TwoStatePreference.class; } @Override protected void updateState(TwoStatePreference preference) { preference.setChecked(ContentResolver.getMasterSyncAutomaticallyAsUser( mUserHandle.getIdentifier())); } @Override protected void onCreateInternal() { // If the dialog is still up, reattach the preference ConfirmationDialogFragment dialog = (ConfirmationDialogFragment) getFragmentController().findDialogByTag( ConfirmationDialogFragment.TAG); ConfirmationDialogFragment.resetListeners( dialog, mConfirmListener, /* rejectListener= */ null, /* neutralListener= */ null); } @Override protected boolean handlePreferenceChanged(TwoStatePreference preference, Object checked) { getFragmentController().showDialog( getAutoSyncChangeConfirmationDialogFragment((boolean) checked), ConfirmationDialogFragment.TAG); // The dialog will change the state of the preference if the user confirms, so don't handle // it here return false; } private ConfirmationDialogFragment getAutoSyncChangeConfirmationDialogFragment( boolean enabling) { int dialogTitle; int dialogMessage; if (enabling) { dialogTitle = R.string.data_usage_auto_sync_on_dialog_title; dialogMessage = R.string.data_usage_auto_sync_on_dialog; } else { dialogTitle = R.string.data_usage_auto_sync_off_dialog_title; dialogMessage = R.string.data_usage_auto_sync_off_dialog; } ConfirmationDialogFragment dialogFragment = new ConfirmationDialogFragment.Builder(getContext()) .setTitle(dialogTitle).setMessage(dialogMessage) .setPositiveButton(android.R.string.ok, mConfirmListener) .setNegativeButton(android.R.string.cancel, /* rejectListener= */ null) .addArgumentBoolean(KEY_ENABLING, enabling) .addArgumentParcelable(KEY_USER_HANDLE, mUserHandle) .build(); return dialogFragment; } }