Loading src/com/android/settings/MasterClear.java +18 −17 Original line number Diff line number Diff line Loading @@ -73,7 +73,7 @@ import java.util.List; * * This is the initial screen. */ public class MasterClear extends InstrumentedFragment { public class MasterClear extends InstrumentedFragment implements OnGlobalLayoutListener { private static final String TAG = "MasterClear"; @VisibleForTesting static final int KEYGUARD_REQUEST = 55; Loading @@ -86,20 +86,17 @@ public class MasterClear extends InstrumentedFragment { static final String ERASE_ESIMS_EXTRA = "erase_esim"; private View mContentView; private Button mInitiateButton; @VisibleForTesting Button mInitiateButton; private View mExternalStorageContainer; @VisibleForTesting CheckBox mExternalStorage; private View mEsimStorageContainer; @VisibleForTesting CheckBox mEsimStorage; private ScrollView mScrollView; @VisibleForTesting ScrollView mScrollView; private final OnGlobalLayoutListener mOnGlobalLayoutListener = new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mScrollView.getViewTreeObserver().removeOnGlobalLayoutListener(mOnGlobalLayoutListener); mInitiateButton.setEnabled(hasReachedBottom(mScrollView)); } }; @Override public void onCreate(@Nullable Bundle savedInstanceState) { Loading Loading @@ -259,13 +256,16 @@ public class MasterClear extends InstrumentedFragment { */ @VisibleForTesting void establishInitialState() { mInitiateButton = (Button) mContentView.findViewById(R.id.initiate_master_clear); mInitiateButton = mContentView.findViewById(R.id.initiate_master_clear); mInitiateButton.setOnClickListener(mInitiateListener); mExternalStorageContainer = mContentView.findViewById(R.id.erase_external_container); mExternalStorage = (CheckBox) mContentView.findViewById(R.id.erase_external); mExternalStorage = mContentView.findViewById(R.id.erase_external); mEsimStorageContainer = mContentView.findViewById(R.id.erase_esim_container); mEsimStorage = (CheckBox) mContentView.findViewById(R.id.erase_esim); mScrollView = (ScrollView) mContentView.findViewById(R.id.master_clear_scrollview); mEsimStorage = mContentView.findViewById(R.id.erase_esim); if (mScrollView != null) { mScrollView.getViewTreeObserver().removeOnGlobalLayoutListener(this); } mScrollView = mContentView.findViewById(R.id.master_clear_scrollview); /* * If the external storage is emulated, it will be erased with a factory Loading Loading @@ -322,8 +322,8 @@ public class MasterClear extends InstrumentedFragment { final UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE); loadAccountList(um); StringBuffer contentDescription = new StringBuffer(); View masterClearContainer = mContentView.findViewById(R.id.master_clear_container); final StringBuffer contentDescription = new StringBuffer(); final View masterClearContainer = mContentView.findViewById(R.id.master_clear_container); getContentDescription(masterClearContainer, contentDescription); masterClearContainer.setContentDescription(contentDescription); Loading @@ -334,12 +334,13 @@ public class MasterClear extends InstrumentedFragment { int oldScrollY) { if (v instanceof ScrollView && hasReachedBottom((ScrollView) v)) { mInitiateButton.setEnabled(true); mScrollView.setOnScrollChangeListener(null); } } }); // Set the initial state of the initiateButton mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(mOnGlobalLayoutListener); mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(this); } /** Loading tests/robotests/src/com/android/settings/MasterClearTest.java +17 −7 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import static org.mockito.Mockito.eq; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; Loading @@ -33,7 +34,6 @@ import static org.robolectric.Shadows.shadowOf; import android.accounts.Account; import android.accounts.AccountManager; import android.app.Activity; import android.app.Fragment; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; Loading @@ -41,11 +41,11 @@ import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Bundle; import android.provider.Settings; import android.view.LayoutInflater; import android.view.View; import android.widget.CheckBox; import android.view.ViewTreeObserver; import android.widget.Button; import android.widget.LinearLayout; import android.widget.ScrollView; Loading @@ -61,7 +61,6 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowAccountManager; import org.robolectric.shadows.ShadowActivity; @RunWith(SettingsRobolectricTestRunner.class) Loading @@ -76,8 +75,6 @@ public class MasterClearTest { private static final String TEST_CONFIRMATION_CLASS = "android.test.conf.pkg.ConfActivity"; private static final String TEST_ACCOUNT_NAME = "test@example.com"; @Mock private MasterClear mMasterClear; @Mock private ScrollView mScrollView; @Mock Loading @@ -95,8 +92,8 @@ public class MasterClearTest { @Mock private Intent mMockIntent; private MasterClear mMasterClear; private ShadowActivity mShadowActivity; private ShadowAccountManager mShadowAccountManager; private Activity mActivity; private View mContentView; Loading Loading @@ -372,6 +369,19 @@ public class MasterClearTest { assertThat(mMasterClear.isValidRequestCode(0)).isFalse(); } @Test public void testOnGlobalLayout_shouldNotRemoveListener() { final ViewTreeObserver viewTreeObserver = mock(ViewTreeObserver.class); mMasterClear.mScrollView = mScrollView; mMasterClear.mInitiateButton = mock(Button.class); doReturn(true).when(mMasterClear).hasReachedBottom(any()); when(mScrollView.getViewTreeObserver()).thenReturn(viewTreeObserver); mMasterClear.onGlobalLayout(); verify(viewTreeObserver, never()).removeOnGlobalLayoutListener(mMasterClear); } private void initScrollView(int height, int scrollY, int childBottom) { when(mScrollView.getHeight()).thenReturn(height); when(mScrollView.getScrollY()).thenReturn(scrollY); Loading Loading
src/com/android/settings/MasterClear.java +18 −17 Original line number Diff line number Diff line Loading @@ -73,7 +73,7 @@ import java.util.List; * * This is the initial screen. */ public class MasterClear extends InstrumentedFragment { public class MasterClear extends InstrumentedFragment implements OnGlobalLayoutListener { private static final String TAG = "MasterClear"; @VisibleForTesting static final int KEYGUARD_REQUEST = 55; Loading @@ -86,20 +86,17 @@ public class MasterClear extends InstrumentedFragment { static final String ERASE_ESIMS_EXTRA = "erase_esim"; private View mContentView; private Button mInitiateButton; @VisibleForTesting Button mInitiateButton; private View mExternalStorageContainer; @VisibleForTesting CheckBox mExternalStorage; private View mEsimStorageContainer; @VisibleForTesting CheckBox mEsimStorage; private ScrollView mScrollView; @VisibleForTesting ScrollView mScrollView; private final OnGlobalLayoutListener mOnGlobalLayoutListener = new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mScrollView.getViewTreeObserver().removeOnGlobalLayoutListener(mOnGlobalLayoutListener); mInitiateButton.setEnabled(hasReachedBottom(mScrollView)); } }; @Override public void onCreate(@Nullable Bundle savedInstanceState) { Loading Loading @@ -259,13 +256,16 @@ public class MasterClear extends InstrumentedFragment { */ @VisibleForTesting void establishInitialState() { mInitiateButton = (Button) mContentView.findViewById(R.id.initiate_master_clear); mInitiateButton = mContentView.findViewById(R.id.initiate_master_clear); mInitiateButton.setOnClickListener(mInitiateListener); mExternalStorageContainer = mContentView.findViewById(R.id.erase_external_container); mExternalStorage = (CheckBox) mContentView.findViewById(R.id.erase_external); mExternalStorage = mContentView.findViewById(R.id.erase_external); mEsimStorageContainer = mContentView.findViewById(R.id.erase_esim_container); mEsimStorage = (CheckBox) mContentView.findViewById(R.id.erase_esim); mScrollView = (ScrollView) mContentView.findViewById(R.id.master_clear_scrollview); mEsimStorage = mContentView.findViewById(R.id.erase_esim); if (mScrollView != null) { mScrollView.getViewTreeObserver().removeOnGlobalLayoutListener(this); } mScrollView = mContentView.findViewById(R.id.master_clear_scrollview); /* * If the external storage is emulated, it will be erased with a factory Loading Loading @@ -322,8 +322,8 @@ public class MasterClear extends InstrumentedFragment { final UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE); loadAccountList(um); StringBuffer contentDescription = new StringBuffer(); View masterClearContainer = mContentView.findViewById(R.id.master_clear_container); final StringBuffer contentDescription = new StringBuffer(); final View masterClearContainer = mContentView.findViewById(R.id.master_clear_container); getContentDescription(masterClearContainer, contentDescription); masterClearContainer.setContentDescription(contentDescription); Loading @@ -334,12 +334,13 @@ public class MasterClear extends InstrumentedFragment { int oldScrollY) { if (v instanceof ScrollView && hasReachedBottom((ScrollView) v)) { mInitiateButton.setEnabled(true); mScrollView.setOnScrollChangeListener(null); } } }); // Set the initial state of the initiateButton mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(mOnGlobalLayoutListener); mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(this); } /** Loading
tests/robotests/src/com/android/settings/MasterClearTest.java +17 −7 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import static org.mockito.Mockito.eq; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; Loading @@ -33,7 +34,6 @@ import static org.robolectric.Shadows.shadowOf; import android.accounts.Account; import android.accounts.AccountManager; import android.app.Activity; import android.app.Fragment; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; Loading @@ -41,11 +41,11 @@ import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Bundle; import android.provider.Settings; import android.view.LayoutInflater; import android.view.View; import android.widget.CheckBox; import android.view.ViewTreeObserver; import android.widget.Button; import android.widget.LinearLayout; import android.widget.ScrollView; Loading @@ -61,7 +61,6 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowAccountManager; import org.robolectric.shadows.ShadowActivity; @RunWith(SettingsRobolectricTestRunner.class) Loading @@ -76,8 +75,6 @@ public class MasterClearTest { private static final String TEST_CONFIRMATION_CLASS = "android.test.conf.pkg.ConfActivity"; private static final String TEST_ACCOUNT_NAME = "test@example.com"; @Mock private MasterClear mMasterClear; @Mock private ScrollView mScrollView; @Mock Loading @@ -95,8 +92,8 @@ public class MasterClearTest { @Mock private Intent mMockIntent; private MasterClear mMasterClear; private ShadowActivity mShadowActivity; private ShadowAccountManager mShadowAccountManager; private Activity mActivity; private View mContentView; Loading Loading @@ -372,6 +369,19 @@ public class MasterClearTest { assertThat(mMasterClear.isValidRequestCode(0)).isFalse(); } @Test public void testOnGlobalLayout_shouldNotRemoveListener() { final ViewTreeObserver viewTreeObserver = mock(ViewTreeObserver.class); mMasterClear.mScrollView = mScrollView; mMasterClear.mInitiateButton = mock(Button.class); doReturn(true).when(mMasterClear).hasReachedBottom(any()); when(mScrollView.getViewTreeObserver()).thenReturn(viewTreeObserver); mMasterClear.onGlobalLayout(); verify(viewTreeObserver, never()).removeOnGlobalLayoutListener(mMasterClear); } private void initScrollView(int height, int scrollY, int childBottom) { when(mScrollView.getHeight()).thenReturn(height); when(mScrollView.getScrollY()).thenReturn(scrollY); Loading