Merge "Fix "Automatically sync app data" button state not changed" into tm-dev
This commit is contained in:
@@ -30,6 +30,7 @@ import android.util.Log;
|
|||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
|
import androidx.preference.PreferenceFragmentCompat;
|
||||||
import androidx.preference.SwitchPreference;
|
import androidx.preference.SwitchPreference;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
@@ -45,11 +46,11 @@ public class AutoSyncDataPreferenceController extends AbstractPreferenceControll
|
|||||||
private static final String KEY_AUTO_SYNC_ACCOUNT = "auto_sync_account_data";
|
private static final String KEY_AUTO_SYNC_ACCOUNT = "auto_sync_account_data";
|
||||||
|
|
||||||
protected final UserManager mUserManager;
|
protected final UserManager mUserManager;
|
||||||
private final Fragment mParentFragment;
|
private final PreferenceFragmentCompat mParentFragment;
|
||||||
|
|
||||||
protected UserHandle mUserHandle;
|
protected UserHandle mUserHandle;
|
||||||
|
|
||||||
public AutoSyncDataPreferenceController(Context context, Fragment parent) {
|
public AutoSyncDataPreferenceController(Context context, PreferenceFragmentCompat parent) {
|
||||||
super(context);
|
super(context);
|
||||||
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
|
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
|
||||||
mParentFragment = parent;
|
mParentFragment = parent;
|
||||||
@@ -72,8 +73,9 @@ public class AutoSyncDataPreferenceController extends AbstractPreferenceControll
|
|||||||
if (ActivityManager.isUserAMonkey()) {
|
if (ActivityManager.isUserAMonkey()) {
|
||||||
Log.d(TAG, "ignoring monkey's attempt to flip sync state");
|
Log.d(TAG, "ignoring monkey's attempt to flip sync state");
|
||||||
} else {
|
} else {
|
||||||
ConfirmAutoSyncChangeFragment.show(mParentFragment, checked, mUserHandle,
|
ConfirmAutoSyncChangeFragment
|
||||||
switchPreference);
|
.newInstance(checked, mUserHandle.getIdentifier(), getPreferenceKey())
|
||||||
|
.show(mParentFragment);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -97,34 +99,33 @@ public class AutoSyncDataPreferenceController extends AbstractPreferenceControll
|
|||||||
*/
|
*/
|
||||||
public static class ConfirmAutoSyncChangeFragment extends InstrumentedDialogFragment implements
|
public static class ConfirmAutoSyncChangeFragment extends InstrumentedDialogFragment implements
|
||||||
DialogInterface.OnClickListener {
|
DialogInterface.OnClickListener {
|
||||||
private static final String SAVE_ENABLING = "enabling";
|
private static final String ARG_ENABLING = "enabling";
|
||||||
private static final String SAVE_USER_HANDLE = "userHandle";
|
private static final String ARG_USER_ID = "userId";
|
||||||
boolean mEnabling;
|
private static final String ARG_KEY = "key";
|
||||||
UserHandle mUserHandle;
|
|
||||||
SwitchPreference mPreference;
|
|
||||||
|
|
||||||
public static void show(Fragment parent, boolean enabling, UserHandle userHandle,
|
static ConfirmAutoSyncChangeFragment newInstance(boolean enabling, int userId, String key) {
|
||||||
SwitchPreference preference) {
|
ConfirmAutoSyncChangeFragment dialogFragment = new ConfirmAutoSyncChangeFragment();
|
||||||
if (!parent.isAdded()) return;
|
Bundle arguments = new Bundle();
|
||||||
|
arguments.putBoolean(ARG_ENABLING, enabling);
|
||||||
|
arguments.putInt(ARG_USER_ID, userId);
|
||||||
|
arguments.putString(ARG_KEY, key);
|
||||||
|
dialogFragment.setArguments(arguments);
|
||||||
|
return dialogFragment;
|
||||||
|
}
|
||||||
|
|
||||||
final ConfirmAutoSyncChangeFragment dialog = new ConfirmAutoSyncChangeFragment();
|
void show(PreferenceFragmentCompat parent) {
|
||||||
dialog.mEnabling = enabling;
|
if (!parent.isAdded()) {
|
||||||
dialog.mUserHandle = userHandle;
|
return;
|
||||||
dialog.setTargetFragment(parent, 0);
|
}
|
||||||
dialog.mPreference = preference;
|
setTargetFragment(parent, 0);
|
||||||
dialog.show(parent.getFragmentManager(), TAG_CONFIRM_AUTO_SYNC_CHANGE);
|
show(parent.getParentFragmentManager(), TAG_CONFIRM_AUTO_SYNC_CHANGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||||
final Context context = getActivity();
|
final Context context = getActivity();
|
||||||
if (savedInstanceState != null) {
|
|
||||||
mEnabling = savedInstanceState.getBoolean(SAVE_ENABLING);
|
|
||||||
mUserHandle = (UserHandle) savedInstanceState.getParcelable(SAVE_USER_HANDLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
final AlertDialog.Builder builder = new AlertDialog.Builder(context);
|
final AlertDialog.Builder builder = new AlertDialog.Builder(context);
|
||||||
if (!mEnabling) {
|
if (!requireArguments().getBoolean(ARG_ENABLING)) {
|
||||||
builder.setTitle(R.string.data_usage_auto_sync_off_dialog_title);
|
builder.setTitle(R.string.data_usage_auto_sync_off_dialog_title);
|
||||||
builder.setMessage(R.string.data_usage_auto_sync_off_dialog);
|
builder.setMessage(R.string.data_usage_auto_sync_off_dialog);
|
||||||
} else {
|
} else {
|
||||||
@@ -138,13 +139,6 @@ public class AutoSyncDataPreferenceController extends AbstractPreferenceControll
|
|||||||
return builder.create();
|
return builder.create();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSaveInstanceState(Bundle outState) {
|
|
||||||
super.onSaveInstanceState(outState);
|
|
||||||
outState.putBoolean(SAVE_ENABLING, mEnabling);
|
|
||||||
outState.putParcelable(SAVE_USER_HANDLE, mUserHandle);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getMetricsCategory() {
|
public int getMetricsCategory() {
|
||||||
return SettingsEnums.DIALOG_CONFIRM_AUTO_SYNC_CHANGE;
|
return SettingsEnums.DIALOG_CONFIRM_AUTO_SYNC_CHANGE;
|
||||||
@@ -153,10 +147,18 @@ public class AutoSyncDataPreferenceController extends AbstractPreferenceControll
|
|||||||
@Override
|
@Override
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
if (which == DialogInterface.BUTTON_POSITIVE) {
|
if (which == DialogInterface.BUTTON_POSITIVE) {
|
||||||
ContentResolver.setMasterSyncAutomaticallyAsUser(mEnabling,
|
Bundle arguments = requireArguments();
|
||||||
mUserHandle.getIdentifier());
|
boolean enabling = arguments.getBoolean(ARG_ENABLING);
|
||||||
if (mPreference != null) {
|
ContentResolver.setMasterSyncAutomaticallyAsUser(enabling,
|
||||||
mPreference.setChecked(mEnabling);
|
arguments.getInt(ARG_USER_ID));
|
||||||
|
Fragment targetFragment = getTargetFragment();
|
||||||
|
if (targetFragment instanceof PreferenceFragmentCompat) {
|
||||||
|
Preference preference =
|
||||||
|
((PreferenceFragmentCompat) targetFragment).findPreference(
|
||||||
|
arguments.getString(ARG_KEY));
|
||||||
|
if (preference instanceof SwitchPreference) {
|
||||||
|
((SwitchPreference) preference).setChecked(enabling);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -18,14 +18,14 @@ package com.android.settings.users;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
|
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.preference.PreferenceFragmentCompat;
|
||||||
|
|
||||||
public class AutoSyncPersonalDataPreferenceController extends AutoSyncDataPreferenceController {
|
public class AutoSyncPersonalDataPreferenceController extends AutoSyncDataPreferenceController {
|
||||||
|
|
||||||
private static final String TAG = "AutoSyncPersonalData";
|
|
||||||
private static final String KEY_AUTO_SYNC_PERSONAL_ACCOUNT = "auto_sync_personal_account_data";
|
private static final String KEY_AUTO_SYNC_PERSONAL_ACCOUNT = "auto_sync_personal_account_data";
|
||||||
|
|
||||||
public AutoSyncPersonalDataPreferenceController(Context context, Fragment parent) {
|
public AutoSyncPersonalDataPreferenceController(Context context,
|
||||||
|
PreferenceFragmentCompat parent) {
|
||||||
super(context, parent);
|
super(context, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -18,16 +18,15 @@ package com.android.settings.users;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
|
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.preference.PreferenceFragmentCompat;
|
||||||
|
|
||||||
import com.android.settings.Utils;
|
import com.android.settings.Utils;
|
||||||
|
|
||||||
public class AutoSyncWorkDataPreferenceController extends AutoSyncPersonalDataPreferenceController {
|
public class AutoSyncWorkDataPreferenceController extends AutoSyncPersonalDataPreferenceController {
|
||||||
|
|
||||||
private static final String TAG = "AutoSyncWorkData";
|
|
||||||
private static final String KEY_AUTO_SYNC_WORK_ACCOUNT = "auto_sync_work_account_data";
|
private static final String KEY_AUTO_SYNC_WORK_ACCOUNT = "auto_sync_work_account_data";
|
||||||
|
|
||||||
public AutoSyncWorkDataPreferenceController(Context context, Fragment parent) {
|
public AutoSyncWorkDataPreferenceController(Context context, PreferenceFragmentCompat parent) {
|
||||||
super(context, parent);
|
super(context, parent);
|
||||||
mUserHandle = Utils.getManagedProfileWithDisabled(mUserManager);
|
mUserHandle = Utils.getManagedProfileWithDisabled(mUserManager);
|
||||||
}
|
}
|
||||||
|
@@ -19,6 +19,7 @@ package com.android.settings.testutils.shadow;
|
|||||||
import static android.provider.SearchIndexablesContract.INDEXABLES_RAW_COLUMNS;
|
import static android.provider.SearchIndexablesContract.INDEXABLES_RAW_COLUMNS;
|
||||||
|
|
||||||
import android.accounts.Account;
|
import android.accounts.Account;
|
||||||
|
import android.annotation.UserIdInt;
|
||||||
import android.content.ContentResolver;
|
import android.content.ContentResolver;
|
||||||
import android.content.SyncAdapterType;
|
import android.content.SyncAdapterType;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
@@ -76,8 +77,12 @@ public class ShadowContentResolver {
|
|||||||
|
|
||||||
@Implementation
|
@Implementation
|
||||||
protected static boolean getMasterSyncAutomaticallyAsUser(int userId) {
|
protected static boolean getMasterSyncAutomaticallyAsUser(int userId) {
|
||||||
return sMasterSyncAutomatically.containsKey(userId)
|
return sMasterSyncAutomatically.getOrDefault(userId, true);
|
||||||
? sMasterSyncAutomatically.get(userId) : true;
|
}
|
||||||
|
|
||||||
|
@Implementation
|
||||||
|
protected static void setMasterSyncAutomaticallyAsUser(boolean sync, @UserIdInt int userId) {
|
||||||
|
sMasterSyncAutomatically.put(userId, sync);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setSyncAdapterTypes(SyncAdapterType[] syncAdapterTypes) {
|
public static void setSyncAdapterTypes(SyncAdapterType[] syncAdapterTypes) {
|
||||||
|
@@ -21,16 +21,20 @@ import static org.mockito.Answers.RETURNS_DEEP_STUBS;
|
|||||||
import static org.mockito.ArgumentMatchers.anyInt;
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.content.ContentResolver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.content.pm.UserInfo;
|
import android.content.pm.UserInfo;
|
||||||
import android.os.UserManager;
|
import android.os.UserManager;
|
||||||
|
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.preference.PreferenceFragmentCompat;
|
||||||
import androidx.preference.Preference;
|
|
||||||
import androidx.preference.PreferenceScreen;
|
import androidx.preference.PreferenceScreen;
|
||||||
import androidx.preference.SwitchPreference;
|
import androidx.preference.SwitchPreference;
|
||||||
|
|
||||||
|
import com.android.settings.testutils.shadow.ShadowContentResolver;
|
||||||
|
import com.android.settings.users.AutoSyncDataPreferenceController.ConfirmAutoSyncChangeFragment;
|
||||||
|
|
||||||
|
import org.junit.After;
|
||||||
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;
|
||||||
@@ -38,12 +42,14 @@ import org.mockito.Mock;
|
|||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
import org.robolectric.RobolectricTestRunner;
|
||||||
import org.robolectric.RuntimeEnvironment;
|
import org.robolectric.RuntimeEnvironment;
|
||||||
|
import org.robolectric.annotation.Config;
|
||||||
import org.robolectric.shadows.ShadowApplication;
|
import org.robolectric.shadows.ShadowApplication;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(RobolectricTestRunner.class)
|
||||||
|
@Config(shadows = {ShadowContentResolver.class})
|
||||||
public class AutoSyncDataPreferenceControllerTest {
|
public class AutoSyncDataPreferenceControllerTest {
|
||||||
|
|
||||||
@Mock(answer = RETURNS_DEEP_STUBS)
|
@Mock(answer = RETURNS_DEEP_STUBS)
|
||||||
@@ -51,12 +57,11 @@ public class AutoSyncDataPreferenceControllerTest {
|
|||||||
@Mock(answer = RETURNS_DEEP_STUBS)
|
@Mock(answer = RETURNS_DEEP_STUBS)
|
||||||
private UserManager mUserManager;
|
private UserManager mUserManager;
|
||||||
@Mock
|
@Mock
|
||||||
private Fragment mFragment;
|
private PreferenceFragmentCompat mFragment;
|
||||||
|
|
||||||
private Preference mPreference;
|
private SwitchPreference mPreference;
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
private AutoSyncDataPreferenceController mController;
|
private AutoSyncDataPreferenceController mController;
|
||||||
private AutoSyncDataPreferenceController.ConfirmAutoSyncChangeFragment mConfirmSyncFragment;
|
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
@@ -65,11 +70,17 @@ public class AutoSyncDataPreferenceControllerTest {
|
|||||||
shadowContext.setSystemService(Context.USER_SERVICE, mUserManager);
|
shadowContext.setSystemService(Context.USER_SERVICE, mUserManager);
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = RuntimeEnvironment.application;
|
||||||
mController = new AutoSyncDataPreferenceController(mContext, mFragment);
|
mController = new AutoSyncDataPreferenceController(mContext, mFragment);
|
||||||
mConfirmSyncFragment = new AutoSyncDataPreferenceController.ConfirmAutoSyncChangeFragment();
|
String preferenceKey = mController.getPreferenceKey();
|
||||||
mConfirmSyncFragment.setTargetFragment(mFragment, 0);
|
mPreference = new SwitchPreference(mContext);
|
||||||
mPreference = new Preference(mContext);
|
mPreference.setKey(preferenceKey);
|
||||||
mPreference.setKey(mController.getPreferenceKey());
|
mPreference.setChecked(true);
|
||||||
when(mScreen.findPreference(mPreference.getKey())).thenReturn(mPreference);
|
when(mScreen.findPreference(preferenceKey)).thenReturn(mPreference);
|
||||||
|
when(mFragment.findPreference(preferenceKey)).thenReturn(mPreference);
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown() {
|
||||||
|
ShadowContentResolver.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -119,15 +130,26 @@ public class AutoSyncDataPreferenceControllerTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void autoSyncData_shouldNotBeSetOnCancel() {
|
public void confirmDialog_uncheckThenOk_shouldUncheck() {
|
||||||
final Context context = RuntimeEnvironment.application;
|
ConfirmAutoSyncChangeFragment confirmSyncFragment =
|
||||||
final SwitchPreference preference = new SwitchPreference(context);
|
ConfirmAutoSyncChangeFragment.newInstance(false, 0, mController.getPreferenceKey());
|
||||||
preference.setChecked(false);
|
confirmSyncFragment.setTargetFragment(mFragment, 0);
|
||||||
mController = new AutoSyncDataPreferenceController(context, mFragment);
|
|
||||||
mConfirmSyncFragment.mPreference = preference;
|
|
||||||
mConfirmSyncFragment.mEnabling = true;
|
|
||||||
|
|
||||||
mConfirmSyncFragment.onClick(null, DialogInterface.BUTTON_NEGATIVE);
|
confirmSyncFragment.onClick(null, DialogInterface.BUTTON_POSITIVE);
|
||||||
assertThat(preference.isChecked()).isFalse();
|
|
||||||
|
assertThat(ContentResolver.getMasterSyncAutomaticallyAsUser(0)).isFalse();
|
||||||
|
assertThat(mPreference.isChecked()).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void confirmDialog_uncheckThenCancel_shouldNotUncheck() {
|
||||||
|
ConfirmAutoSyncChangeFragment confirmSyncFragment =
|
||||||
|
ConfirmAutoSyncChangeFragment.newInstance(false, 0, mController.getPreferenceKey());
|
||||||
|
confirmSyncFragment.setTargetFragment(mFragment, 0);
|
||||||
|
|
||||||
|
confirmSyncFragment.onClick(null, DialogInterface.BUTTON_NEGATIVE);
|
||||||
|
|
||||||
|
assertThat(ContentResolver.getMasterSyncAutomaticallyAsUser(0)).isTrue();
|
||||||
|
assertThat(mPreference.isChecked()).isTrue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -25,8 +25,8 @@ import android.content.Context;
|
|||||||
import android.content.pm.UserInfo;
|
import android.content.pm.UserInfo;
|
||||||
import android.os.UserManager;
|
import android.os.UserManager;
|
||||||
|
|
||||||
import androidx.fragment.app.Fragment;
|
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
|
import androidx.preference.PreferenceFragmentCompat;
|
||||||
import androidx.preference.PreferenceScreen;
|
import androidx.preference.PreferenceScreen;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
@@ -49,7 +49,7 @@ public class AutoSyncPersonalDataPreferenceControllerTest {
|
|||||||
@Mock(answer = RETURNS_DEEP_STUBS)
|
@Mock(answer = RETURNS_DEEP_STUBS)
|
||||||
private UserManager mUserManager;
|
private UserManager mUserManager;
|
||||||
@Mock(answer = RETURNS_DEEP_STUBS)
|
@Mock(answer = RETURNS_DEEP_STUBS)
|
||||||
private Fragment mFragment;
|
private PreferenceFragmentCompat mFragment;
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
private Preference mPreference;
|
private Preference mPreference;
|
||||||
|
@@ -27,17 +27,17 @@ import android.content.pm.UserInfo;
|
|||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.os.UserManager;
|
import android.os.UserManager;
|
||||||
|
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.preference.PreferenceFragmentCompat;
|
||||||
|
|
||||||
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;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
|
import org.robolectric.RobolectricTestRunner;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(RobolectricTestRunner.class)
|
||||||
public class AutoSyncWorkDataPreferenceControllerTest {
|
public class AutoSyncWorkDataPreferenceControllerTest {
|
||||||
@@ -47,7 +47,7 @@ public class AutoSyncWorkDataPreferenceControllerTest {
|
|||||||
@Mock(answer = RETURNS_DEEP_STUBS)
|
@Mock(answer = RETURNS_DEEP_STUBS)
|
||||||
private UserManager mUserManager;
|
private UserManager mUserManager;
|
||||||
@Mock(answer = RETURNS_DEEP_STUBS)
|
@Mock(answer = RETURNS_DEEP_STUBS)
|
||||||
private Fragment mFragment;
|
private PreferenceFragmentCompat mFragment;
|
||||||
@Mock
|
@Mock
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user