Loading packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -331,7 +331,7 @@ public class InternetDialog extends SystemUIDialog implements showProgressBar(); showProgressBar(); final boolean isDeviceLocked = mInternetDialogController.isDeviceLocked(); final boolean isDeviceLocked = mInternetDialogController.isDeviceLocked(); final boolean isWifiEnabled = mWifiManager.isWifiEnabled(); final boolean isWifiEnabled = mWifiManager.isWifiEnabled(); final boolean isWifiScanEnabled = mWifiManager.isScanAlwaysAvailable(); final boolean isWifiScanEnabled = mInternetDialogController.isWifiScanEnabled(); updateWifiToggle(isWifiEnabled, isDeviceLocked); updateWifiToggle(isWifiEnabled, isDeviceLocked); updateConnectedWifi(isWifiEnabled, isDeviceLocked); updateConnectedWifi(isWifiEnabled, isDeviceLocked); updateWifiScanNotify(isWifiEnabled, isWifiScanEnabled, isDeviceLocked); updateWifiScanNotify(isWifiEnabled, isWifiScanEnabled, isDeviceLocked); Loading packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java +13 −1 Original line number Original line Diff line number Diff line Loading @@ -76,6 +76,7 @@ import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.LocationController; import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.NetworkController.AccessPointController; import com.android.systemui.statusbar.policy.NetworkController.AccessPointController; import com.android.systemui.toast.SystemUIToast; import com.android.systemui.toast.SystemUIToast; Loading Loading @@ -150,6 +151,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, private WindowManager mWindowManager; private WindowManager mWindowManager; private ToastFactory mToastFactory; private ToastFactory mToastFactory; private SignalDrawable mSignalDrawable; private SignalDrawable mSignalDrawable; private LocationController mLocationController; @VisibleForTesting @VisibleForTesting static final float TOAST_PARAMS_HORIZONTAL_WEIGHT = 1.0f; static final float TOAST_PARAMS_HORIZONTAL_WEIGHT = 1.0f; Loading Loading @@ -199,7 +201,8 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, GlobalSettings globalSettings, KeyguardStateController keyguardStateController, GlobalSettings globalSettings, KeyguardStateController keyguardStateController, WindowManager windowManager, ToastFactory toastFactory, WindowManager windowManager, ToastFactory toastFactory, @Background Handler workerHandler, @Background Handler workerHandler, CarrierConfigTracker carrierConfigTracker) { CarrierConfigTracker carrierConfigTracker, LocationController locationController) { if (DEBUG) { if (DEBUG) { Log.d(TAG, "Init InternetDialogController"); Log.d(TAG, "Init InternetDialogController"); } } Loading Loading @@ -227,6 +230,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, mWindowManager = windowManager; mWindowManager = windowManager; mToastFactory = toastFactory; mToastFactory = toastFactory; mSignalDrawable = new SignalDrawable(mContext); mSignalDrawable = new SignalDrawable(mContext); mLocationController = locationController; } } void onStart(@NonNull InternetDialogCallback callback, boolean canConfigWifi) { void onStart(@NonNull InternetDialogCallback callback, boolean canConfigWifi) { Loading Loading @@ -788,6 +792,14 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, return false; return false; } } @WorkerThread boolean isWifiScanEnabled() { if (!mLocationController.isLocationEnabled()) { return false; } return mWifiManager.isScanAlwaysAvailable(); } static class WifiEntryConnectCallback implements WifiEntry.ConnectCallback { static class WifiEntryConnectCallback implements WifiEntry.ConnectCallback { final ActivityStarter mActivityStarter; final ActivityStarter mActivityStarter; final WifiEntry mWifiEntry; final WifiEntry mWifiEntry; Loading packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java +32 −3 Original line number Original line Diff line number Diff line Loading @@ -49,6 +49,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.LocationController; import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.NetworkController.AccessPointController; import com.android.systemui.statusbar.policy.NetworkController.AccessPointController; import com.android.systemui.toast.SystemUIToast; import com.android.systemui.toast.SystemUIToast; Loading Loading @@ -135,6 +136,8 @@ public class InternetDialogControllerTest extends SysuiTestCase { private Animator mAnimator; private Animator mAnimator; @Mock @Mock private CarrierConfigTracker mCarrierConfigTracker; private CarrierConfigTracker mCarrierConfigTracker; @Mock private LocationController mLocationController; private TestableResources mTestableResources; private TestableResources mTestableResources; private MockInternetDialogController mInternetDialogController; private MockInternetDialogController mInternetDialogController; Loading Loading @@ -170,7 +173,8 @@ public class InternetDialogControllerTest extends SysuiTestCase { mSubscriptionManager, mTelephonyManager, mWifiManager, mSubscriptionManager, mTelephonyManager, mWifiManager, mock(ConnectivityManager.class), mHandler, mExecutor, mBroadcastDispatcher, mock(ConnectivityManager.class), mHandler, mExecutor, mBroadcastDispatcher, mock(KeyguardUpdateMonitor.class), mGlobalSettings, mKeyguardStateController, mock(KeyguardUpdateMonitor.class), mGlobalSettings, mKeyguardStateController, mWindowManager, mToastFactory, mWorkerHandler, mCarrierConfigTracker); mWindowManager, mToastFactory, mWorkerHandler, mCarrierConfigTracker, mLocationController); mSubscriptionManager.addOnSubscriptionsChangedListener(mExecutor, mSubscriptionManager.addOnSubscriptionsChangedListener(mExecutor, mInternetDialogController.mOnSubscriptionsChangedListener); mInternetDialogController.mOnSubscriptionsChangedListener); mInternetDialogController.onStart(mInternetDialogCallback, true); mInternetDialogController.onStart(mInternetDialogCallback, true); Loading Loading @@ -602,6 +606,30 @@ public class InternetDialogControllerTest extends SysuiTestCase { verify(mMergedCarrierEntry).setEnabled(false); verify(mMergedCarrierEntry).setEnabled(false); } } @Test public void isWifiScanEnabled_locationOff_returnFalse() { when(mLocationController.isLocationEnabled()).thenReturn(false); when(mWifiManager.isScanAlwaysAvailable()).thenReturn(false); assertThat(mInternetDialogController.isWifiScanEnabled()).isFalse(); when(mWifiManager.isScanAlwaysAvailable()).thenReturn(true); assertThat(mInternetDialogController.isWifiScanEnabled()).isFalse(); } @Test public void isWifiScanEnabled_locationOn_returnIsScanAlwaysAvailable() { when(mLocationController.isLocationEnabled()).thenReturn(true); when(mWifiManager.isScanAlwaysAvailable()).thenReturn(false); assertThat(mInternetDialogController.isWifiScanEnabled()).isFalse(); when(mWifiManager.isScanAlwaysAvailable()).thenReturn(true); assertThat(mInternetDialogController.isWifiScanEnabled()).isTrue(); } private String getResourcesString(String name) { private String getResourcesString(String name) { return mContext.getResources().getString(getResourcesId(name)); return mContext.getResources().getString(getResourcesId(name)); } } Loading @@ -625,12 +653,13 @@ public class InternetDialogControllerTest extends SysuiTestCase { KeyguardUpdateMonitor keyguardUpdateMonitor, GlobalSettings globalSettings, KeyguardUpdateMonitor keyguardUpdateMonitor, GlobalSettings globalSettings, KeyguardStateController keyguardStateController, WindowManager windowManager, KeyguardStateController keyguardStateController, WindowManager windowManager, ToastFactory toastFactory, Handler workerHandler, ToastFactory toastFactory, Handler workerHandler, CarrierConfigTracker carrierConfigTracker) { CarrierConfigTracker carrierConfigTracker, LocationController locationController) { super(context, uiEventLogger, starter, accessPointController, subscriptionManager, super(context, uiEventLogger, starter, accessPointController, subscriptionManager, telephonyManager, wifiManager, connectivityManager, handler, mainExecutor, telephonyManager, wifiManager, connectivityManager, handler, mainExecutor, broadcastDispatcher, keyguardUpdateMonitor, globalSettings, broadcastDispatcher, keyguardUpdateMonitor, globalSettings, keyguardStateController, windowManager, toastFactory, workerHandler, keyguardStateController, windowManager, toastFactory, workerHandler, carrierConfigTracker); carrierConfigTracker, locationController); mGlobalSettings = globalSettings; mGlobalSettings = globalSettings; } } Loading packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogTest.java +3 −3 Original line number Original line Diff line number Diff line Loading @@ -282,7 +282,7 @@ public class InternetDialogTest extends SysuiTestCase { @Test @Test public void updateDialog_wifiOffAndWifiScanOff_hideWifiScanNotify() { public void updateDialog_wifiOffAndWifiScanOff_hideWifiScanNotify() { when(mWifiManager.isWifiEnabled()).thenReturn(false); when(mWifiManager.isWifiEnabled()).thenReturn(false); when(mWifiManager.isScanAlwaysAvailable()).thenReturn(false); when(mInternetDialogController.isWifiScanEnabled()).thenReturn(false); mInternetDialog.updateDialog(); mInternetDialog.updateDialog(); Loading @@ -292,7 +292,7 @@ public class InternetDialogTest extends SysuiTestCase { @Test @Test public void updateDialog_wifiOffAndWifiScanOnAndDeviceLocked_hideWifiScanNotify() { public void updateDialog_wifiOffAndWifiScanOnAndDeviceLocked_hideWifiScanNotify() { when(mWifiManager.isWifiEnabled()).thenReturn(false); when(mWifiManager.isWifiEnabled()).thenReturn(false); when(mWifiManager.isScanAlwaysAvailable()).thenReturn(true); when(mInternetDialogController.isWifiScanEnabled()).thenReturn(true); when(mInternetDialogController.isDeviceLocked()).thenReturn(true); when(mInternetDialogController.isDeviceLocked()).thenReturn(true); mInternetDialog.updateDialog(); mInternetDialog.updateDialog(); Loading @@ -303,7 +303,7 @@ public class InternetDialogTest extends SysuiTestCase { @Test @Test public void updateDialog_wifiOffAndWifiScanOnAndDeviceUnlocked_showWifiScanNotify() { public void updateDialog_wifiOffAndWifiScanOnAndDeviceUnlocked_showWifiScanNotify() { when(mWifiManager.isWifiEnabled()).thenReturn(false); when(mWifiManager.isWifiEnabled()).thenReturn(false); when(mWifiManager.isScanAlwaysAvailable()).thenReturn(true); when(mInternetDialogController.isWifiScanEnabled()).thenReturn(true); when(mInternetDialogController.isDeviceLocked()).thenReturn(false); when(mInternetDialogController.isDeviceLocked()).thenReturn(false); mInternetDialog.updateDialog(); mInternetDialog.updateDialog(); Loading Loading
packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -331,7 +331,7 @@ public class InternetDialog extends SystemUIDialog implements showProgressBar(); showProgressBar(); final boolean isDeviceLocked = mInternetDialogController.isDeviceLocked(); final boolean isDeviceLocked = mInternetDialogController.isDeviceLocked(); final boolean isWifiEnabled = mWifiManager.isWifiEnabled(); final boolean isWifiEnabled = mWifiManager.isWifiEnabled(); final boolean isWifiScanEnabled = mWifiManager.isScanAlwaysAvailable(); final boolean isWifiScanEnabled = mInternetDialogController.isWifiScanEnabled(); updateWifiToggle(isWifiEnabled, isDeviceLocked); updateWifiToggle(isWifiEnabled, isDeviceLocked); updateConnectedWifi(isWifiEnabled, isDeviceLocked); updateConnectedWifi(isWifiEnabled, isDeviceLocked); updateWifiScanNotify(isWifiEnabled, isWifiScanEnabled, isDeviceLocked); updateWifiScanNotify(isWifiEnabled, isWifiScanEnabled, isDeviceLocked); Loading
packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java +13 −1 Original line number Original line Diff line number Diff line Loading @@ -76,6 +76,7 @@ import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.LocationController; import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.NetworkController.AccessPointController; import com.android.systemui.statusbar.policy.NetworkController.AccessPointController; import com.android.systemui.toast.SystemUIToast; import com.android.systemui.toast.SystemUIToast; Loading Loading @@ -150,6 +151,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, private WindowManager mWindowManager; private WindowManager mWindowManager; private ToastFactory mToastFactory; private ToastFactory mToastFactory; private SignalDrawable mSignalDrawable; private SignalDrawable mSignalDrawable; private LocationController mLocationController; @VisibleForTesting @VisibleForTesting static final float TOAST_PARAMS_HORIZONTAL_WEIGHT = 1.0f; static final float TOAST_PARAMS_HORIZONTAL_WEIGHT = 1.0f; Loading Loading @@ -199,7 +201,8 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, GlobalSettings globalSettings, KeyguardStateController keyguardStateController, GlobalSettings globalSettings, KeyguardStateController keyguardStateController, WindowManager windowManager, ToastFactory toastFactory, WindowManager windowManager, ToastFactory toastFactory, @Background Handler workerHandler, @Background Handler workerHandler, CarrierConfigTracker carrierConfigTracker) { CarrierConfigTracker carrierConfigTracker, LocationController locationController) { if (DEBUG) { if (DEBUG) { Log.d(TAG, "Init InternetDialogController"); Log.d(TAG, "Init InternetDialogController"); } } Loading Loading @@ -227,6 +230,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, mWindowManager = windowManager; mWindowManager = windowManager; mToastFactory = toastFactory; mToastFactory = toastFactory; mSignalDrawable = new SignalDrawable(mContext); mSignalDrawable = new SignalDrawable(mContext); mLocationController = locationController; } } void onStart(@NonNull InternetDialogCallback callback, boolean canConfigWifi) { void onStart(@NonNull InternetDialogCallback callback, boolean canConfigWifi) { Loading Loading @@ -788,6 +792,14 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, return false; return false; } } @WorkerThread boolean isWifiScanEnabled() { if (!mLocationController.isLocationEnabled()) { return false; } return mWifiManager.isScanAlwaysAvailable(); } static class WifiEntryConnectCallback implements WifiEntry.ConnectCallback { static class WifiEntryConnectCallback implements WifiEntry.ConnectCallback { final ActivityStarter mActivityStarter; final ActivityStarter mActivityStarter; final WifiEntry mWifiEntry; final WifiEntry mWifiEntry; Loading
packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java +32 −3 Original line number Original line Diff line number Diff line Loading @@ -49,6 +49,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.LocationController; import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.NetworkController.AccessPointController; import com.android.systemui.statusbar.policy.NetworkController.AccessPointController; import com.android.systemui.toast.SystemUIToast; import com.android.systemui.toast.SystemUIToast; Loading Loading @@ -135,6 +136,8 @@ public class InternetDialogControllerTest extends SysuiTestCase { private Animator mAnimator; private Animator mAnimator; @Mock @Mock private CarrierConfigTracker mCarrierConfigTracker; private CarrierConfigTracker mCarrierConfigTracker; @Mock private LocationController mLocationController; private TestableResources mTestableResources; private TestableResources mTestableResources; private MockInternetDialogController mInternetDialogController; private MockInternetDialogController mInternetDialogController; Loading Loading @@ -170,7 +173,8 @@ public class InternetDialogControllerTest extends SysuiTestCase { mSubscriptionManager, mTelephonyManager, mWifiManager, mSubscriptionManager, mTelephonyManager, mWifiManager, mock(ConnectivityManager.class), mHandler, mExecutor, mBroadcastDispatcher, mock(ConnectivityManager.class), mHandler, mExecutor, mBroadcastDispatcher, mock(KeyguardUpdateMonitor.class), mGlobalSettings, mKeyguardStateController, mock(KeyguardUpdateMonitor.class), mGlobalSettings, mKeyguardStateController, mWindowManager, mToastFactory, mWorkerHandler, mCarrierConfigTracker); mWindowManager, mToastFactory, mWorkerHandler, mCarrierConfigTracker, mLocationController); mSubscriptionManager.addOnSubscriptionsChangedListener(mExecutor, mSubscriptionManager.addOnSubscriptionsChangedListener(mExecutor, mInternetDialogController.mOnSubscriptionsChangedListener); mInternetDialogController.mOnSubscriptionsChangedListener); mInternetDialogController.onStart(mInternetDialogCallback, true); mInternetDialogController.onStart(mInternetDialogCallback, true); Loading Loading @@ -602,6 +606,30 @@ public class InternetDialogControllerTest extends SysuiTestCase { verify(mMergedCarrierEntry).setEnabled(false); verify(mMergedCarrierEntry).setEnabled(false); } } @Test public void isWifiScanEnabled_locationOff_returnFalse() { when(mLocationController.isLocationEnabled()).thenReturn(false); when(mWifiManager.isScanAlwaysAvailable()).thenReturn(false); assertThat(mInternetDialogController.isWifiScanEnabled()).isFalse(); when(mWifiManager.isScanAlwaysAvailable()).thenReturn(true); assertThat(mInternetDialogController.isWifiScanEnabled()).isFalse(); } @Test public void isWifiScanEnabled_locationOn_returnIsScanAlwaysAvailable() { when(mLocationController.isLocationEnabled()).thenReturn(true); when(mWifiManager.isScanAlwaysAvailable()).thenReturn(false); assertThat(mInternetDialogController.isWifiScanEnabled()).isFalse(); when(mWifiManager.isScanAlwaysAvailable()).thenReturn(true); assertThat(mInternetDialogController.isWifiScanEnabled()).isTrue(); } private String getResourcesString(String name) { private String getResourcesString(String name) { return mContext.getResources().getString(getResourcesId(name)); return mContext.getResources().getString(getResourcesId(name)); } } Loading @@ -625,12 +653,13 @@ public class InternetDialogControllerTest extends SysuiTestCase { KeyguardUpdateMonitor keyguardUpdateMonitor, GlobalSettings globalSettings, KeyguardUpdateMonitor keyguardUpdateMonitor, GlobalSettings globalSettings, KeyguardStateController keyguardStateController, WindowManager windowManager, KeyguardStateController keyguardStateController, WindowManager windowManager, ToastFactory toastFactory, Handler workerHandler, ToastFactory toastFactory, Handler workerHandler, CarrierConfigTracker carrierConfigTracker) { CarrierConfigTracker carrierConfigTracker, LocationController locationController) { super(context, uiEventLogger, starter, accessPointController, subscriptionManager, super(context, uiEventLogger, starter, accessPointController, subscriptionManager, telephonyManager, wifiManager, connectivityManager, handler, mainExecutor, telephonyManager, wifiManager, connectivityManager, handler, mainExecutor, broadcastDispatcher, keyguardUpdateMonitor, globalSettings, broadcastDispatcher, keyguardUpdateMonitor, globalSettings, keyguardStateController, windowManager, toastFactory, workerHandler, keyguardStateController, windowManager, toastFactory, workerHandler, carrierConfigTracker); carrierConfigTracker, locationController); mGlobalSettings = globalSettings; mGlobalSettings = globalSettings; } } Loading
packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogTest.java +3 −3 Original line number Original line Diff line number Diff line Loading @@ -282,7 +282,7 @@ public class InternetDialogTest extends SysuiTestCase { @Test @Test public void updateDialog_wifiOffAndWifiScanOff_hideWifiScanNotify() { public void updateDialog_wifiOffAndWifiScanOff_hideWifiScanNotify() { when(mWifiManager.isWifiEnabled()).thenReturn(false); when(mWifiManager.isWifiEnabled()).thenReturn(false); when(mWifiManager.isScanAlwaysAvailable()).thenReturn(false); when(mInternetDialogController.isWifiScanEnabled()).thenReturn(false); mInternetDialog.updateDialog(); mInternetDialog.updateDialog(); Loading @@ -292,7 +292,7 @@ public class InternetDialogTest extends SysuiTestCase { @Test @Test public void updateDialog_wifiOffAndWifiScanOnAndDeviceLocked_hideWifiScanNotify() { public void updateDialog_wifiOffAndWifiScanOnAndDeviceLocked_hideWifiScanNotify() { when(mWifiManager.isWifiEnabled()).thenReturn(false); when(mWifiManager.isWifiEnabled()).thenReturn(false); when(mWifiManager.isScanAlwaysAvailable()).thenReturn(true); when(mInternetDialogController.isWifiScanEnabled()).thenReturn(true); when(mInternetDialogController.isDeviceLocked()).thenReturn(true); when(mInternetDialogController.isDeviceLocked()).thenReturn(true); mInternetDialog.updateDialog(); mInternetDialog.updateDialog(); Loading @@ -303,7 +303,7 @@ public class InternetDialogTest extends SysuiTestCase { @Test @Test public void updateDialog_wifiOffAndWifiScanOnAndDeviceUnlocked_showWifiScanNotify() { public void updateDialog_wifiOffAndWifiScanOnAndDeviceUnlocked_showWifiScanNotify() { when(mWifiManager.isWifiEnabled()).thenReturn(false); when(mWifiManager.isWifiEnabled()).thenReturn(false); when(mWifiManager.isScanAlwaysAvailable()).thenReturn(true); when(mInternetDialogController.isWifiScanEnabled()).thenReturn(true); when(mInternetDialogController.isDeviceLocked()).thenReturn(false); when(mInternetDialogController.isDeviceLocked()).thenReturn(false); mInternetDialog.updateDialog(); mInternetDialog.updateDialog(); Loading