Loading src/com/android/settings/Utils.java +28 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ import static android.text.format.DateUtils.FORMAT_ABBREV_MONTH; import static android.text.format.DateUtils.FORMAT_SHOW_DATE; import android.annotation.Nullable; import android.app.ActionBar; import android.app.Activity; import android.app.ActivityManager; import android.app.AppGlobals; import android.app.IActivityManager; Loading Loading @@ -92,6 +94,7 @@ import android.widget.TabWidget; import androidx.annotation.StringRes; import androidx.core.graphics.drawable.IconCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.Lifecycle; import androidx.preference.Preference; import androidx.preference.PreferenceGroup; Loading @@ -101,6 +104,7 @@ import com.android.internal.widget.LockPatternUtils; import com.android.settings.core.FeatureFlags; import com.android.settings.development.featureflags.FeatureFlagPersistent; import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settingslib.widget.ActionBarShadowController; import java.net.InetAddress; import java.util.Iterator; Loading Loading @@ -1023,4 +1027,28 @@ public final class Utils extends com.android.settingslib.Utils { ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); return !(am.isLowRamDevice() && (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)); } /** * Adds a shadow appear/disappear animation to action bar scroll. * * <p/> * This method must be called after {@link Fragment#onCreate(Bundle)}. */ public static void setActionBarShadowAnimation(Activity activity, Lifecycle lifecycle, View scrollView) { if (activity == null) { Log.w(TAG, "No activity, cannot style actionbar."); return; } final ActionBar actionBar = activity.getActionBar(); if (actionBar == null) { Log.w(TAG, "No actionbar, cannot style actionbar."); return; } actionBar.setElevation(0); if (lifecycle != null && scrollView != null) { ActionBarShadowController.attachToView(activity, lifecycle, scrollView); } } } src/com/android/settings/applications/AppAndNotificationDashboardFragment.java +5 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.content.Context; import android.provider.SearchIndexableResource; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.notification.EmergencyBroadcastPreferenceController; import com.android.settings.search.BaseSearchIndexProvider; Loading Loading @@ -85,6 +86,10 @@ public class AppAndNotificationDashboardFragment extends DashboardFragment { super.onResume(); mIsFirstLaunch = false; if (mRecentAppsPreferenceController.isAvailable()) { Utils.setActionBarShadowAnimation(getActivity(), getSettingsLifecycle(), getListView()); } } @Override Loading src/com/android/settings/privacy/PrivacyDashboardFragment.java +2 −23 Original line number Diff line number Diff line Loading @@ -16,25 +16,22 @@ package com.android.settings.privacy; import android.app.ActionBar; import android.app.Activity; import android.app.settings.SettingsEnums; import android.content.Context; import android.os.Bundle; import android.provider.SearchIndexableResource; import android.util.Log; import android.view.View; import androidx.annotation.VisibleForTesting; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.notification.LockScreenNotificationPreferenceController; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.widget.ActionBarShadowController; import java.util.ArrayList; import java.util.List; Loading Loading @@ -87,28 +84,10 @@ public class PrivacyDashboardFragment extends DashboardFragment { @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); styleActionBar(); Utils.setActionBarShadowAnimation(getActivity(), getSettingsLifecycle(), getListView()); initLoadingBar(); } @VisibleForTesting void styleActionBar() { final Activity activity = getActivity(); final ActionBar actionBar = activity.getActionBar(); final Lifecycle lifecycle = getSettingsLifecycle(); final View scrollView = getListView(); if (actionBar == null) { Log.w(TAG, "No actionbar, cannot style actionbar."); return; } actionBar.setElevation(0); if (lifecycle != null && scrollView != null) { ActionBarShadowController.attachToView(activity, lifecycle, scrollView); } } @VisibleForTesting void initLoadingBar() { mProgressHeader = setPinnedHeaderView(R.layout.progress_header); Loading tests/robotests/src/com/android/settings/UtilsTest.java +22 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,8 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.ActionBar; import android.app.Activity; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; Loading @@ -51,15 +53,18 @@ import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; import android.util.IconDrawableFactory; import android.widget.EditText; import android.widget.ScrollView; import android.widget.TextView; import androidx.core.graphics.drawable.IconCompat; import androidx.fragment.app.FragmentActivity; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; Loading Loading @@ -259,4 +264,21 @@ public class UtilsTest { public void isPackageEnabled_noApp_returnFalse() { assertThat(Utils.isPackageEnabled(mContext, PACKAGE_NAME)).isFalse(); } @Test public void setActionBarShadowAnimation_nullParameters_shouldNotCrash() { // no crash here Utils.setActionBarShadowAnimation(null, null, null); } @Test public void setActionBarShadowAnimation_shouldSetElevationToZero() { final FragmentActivity activity = Robolectric.setupActivity(FragmentActivity.class); final ActionBar actionBar = activity.getActionBar(); Utils.setActionBarShadowAnimation(activity, activity.getLifecycle(), new ScrollView(mContext)); assertThat(actionBar.getElevation()).isEqualTo(0.f); } } tests/robotests/src/com/android/settings/privacy/PrivacyDashboardFragmentTest.java +2 −2 Original line number Diff line number Diff line Loading @@ -80,10 +80,10 @@ public class PrivacyDashboardFragmentTest { } @Test public void onViewCreated_shouldCallStyleActionBar() { public void onViewCreated_shouldSetActionBarShadowAnimation() { mFragment.onViewCreated(new View(mContext), new Bundle()); verify(mFragment).styleActionBar(); assertThat(mFragment.getActivity().getActionBar().getElevation()).isEqualTo(0.f); } @Test Loading Loading
src/com/android/settings/Utils.java +28 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ import static android.text.format.DateUtils.FORMAT_ABBREV_MONTH; import static android.text.format.DateUtils.FORMAT_SHOW_DATE; import android.annotation.Nullable; import android.app.ActionBar; import android.app.Activity; import android.app.ActivityManager; import android.app.AppGlobals; import android.app.IActivityManager; Loading Loading @@ -92,6 +94,7 @@ import android.widget.TabWidget; import androidx.annotation.StringRes; import androidx.core.graphics.drawable.IconCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.Lifecycle; import androidx.preference.Preference; import androidx.preference.PreferenceGroup; Loading @@ -101,6 +104,7 @@ import com.android.internal.widget.LockPatternUtils; import com.android.settings.core.FeatureFlags; import com.android.settings.development.featureflags.FeatureFlagPersistent; import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settingslib.widget.ActionBarShadowController; import java.net.InetAddress; import java.util.Iterator; Loading Loading @@ -1023,4 +1027,28 @@ public final class Utils extends com.android.settingslib.Utils { ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); return !(am.isLowRamDevice() && (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)); } /** * Adds a shadow appear/disappear animation to action bar scroll. * * <p/> * This method must be called after {@link Fragment#onCreate(Bundle)}. */ public static void setActionBarShadowAnimation(Activity activity, Lifecycle lifecycle, View scrollView) { if (activity == null) { Log.w(TAG, "No activity, cannot style actionbar."); return; } final ActionBar actionBar = activity.getActionBar(); if (actionBar == null) { Log.w(TAG, "No actionbar, cannot style actionbar."); return; } actionBar.setElevation(0); if (lifecycle != null && scrollView != null) { ActionBarShadowController.attachToView(activity, lifecycle, scrollView); } } }
src/com/android/settings/applications/AppAndNotificationDashboardFragment.java +5 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.content.Context; import android.provider.SearchIndexableResource; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.notification.EmergencyBroadcastPreferenceController; import com.android.settings.search.BaseSearchIndexProvider; Loading Loading @@ -85,6 +86,10 @@ public class AppAndNotificationDashboardFragment extends DashboardFragment { super.onResume(); mIsFirstLaunch = false; if (mRecentAppsPreferenceController.isAvailable()) { Utils.setActionBarShadowAnimation(getActivity(), getSettingsLifecycle(), getListView()); } } @Override Loading
src/com/android/settings/privacy/PrivacyDashboardFragment.java +2 −23 Original line number Diff line number Diff line Loading @@ -16,25 +16,22 @@ package com.android.settings.privacy; import android.app.ActionBar; import android.app.Activity; import android.app.settings.SettingsEnums; import android.content.Context; import android.os.Bundle; import android.provider.SearchIndexableResource; import android.util.Log; import android.view.View; import androidx.annotation.VisibleForTesting; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.notification.LockScreenNotificationPreferenceController; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.widget.ActionBarShadowController; import java.util.ArrayList; import java.util.List; Loading Loading @@ -87,28 +84,10 @@ public class PrivacyDashboardFragment extends DashboardFragment { @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); styleActionBar(); Utils.setActionBarShadowAnimation(getActivity(), getSettingsLifecycle(), getListView()); initLoadingBar(); } @VisibleForTesting void styleActionBar() { final Activity activity = getActivity(); final ActionBar actionBar = activity.getActionBar(); final Lifecycle lifecycle = getSettingsLifecycle(); final View scrollView = getListView(); if (actionBar == null) { Log.w(TAG, "No actionbar, cannot style actionbar."); return; } actionBar.setElevation(0); if (lifecycle != null && scrollView != null) { ActionBarShadowController.attachToView(activity, lifecycle, scrollView); } } @VisibleForTesting void initLoadingBar() { mProgressHeader = setPinnedHeaderView(R.layout.progress_header); Loading
tests/robotests/src/com/android/settings/UtilsTest.java +22 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,8 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.ActionBar; import android.app.Activity; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; Loading @@ -51,15 +53,18 @@ import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; import android.util.IconDrawableFactory; import android.widget.EditText; import android.widget.ScrollView; import android.widget.TextView; import androidx.core.graphics.drawable.IconCompat; import androidx.fragment.app.FragmentActivity; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; Loading Loading @@ -259,4 +264,21 @@ public class UtilsTest { public void isPackageEnabled_noApp_returnFalse() { assertThat(Utils.isPackageEnabled(mContext, PACKAGE_NAME)).isFalse(); } @Test public void setActionBarShadowAnimation_nullParameters_shouldNotCrash() { // no crash here Utils.setActionBarShadowAnimation(null, null, null); } @Test public void setActionBarShadowAnimation_shouldSetElevationToZero() { final FragmentActivity activity = Robolectric.setupActivity(FragmentActivity.class); final ActionBar actionBar = activity.getActionBar(); Utils.setActionBarShadowAnimation(activity, activity.getLifecycle(), new ScrollView(mContext)); assertThat(actionBar.getElevation()).isEqualTo(0.f); } }
tests/robotests/src/com/android/settings/privacy/PrivacyDashboardFragmentTest.java +2 −2 Original line number Diff line number Diff line Loading @@ -80,10 +80,10 @@ public class PrivacyDashboardFragmentTest { } @Test public void onViewCreated_shouldCallStyleActionBar() { public void onViewCreated_shouldSetActionBarShadowAnimation() { mFragment.onViewCreated(new View(mContext), new Bundle()); verify(mFragment).styleActionBar(); assertThat(mFragment.getActivity().getActionBar().getElevation()).isEqualTo(0.f); } @Test Loading