Show Floating action button to request manage credentials

Background
* This is part of the work to support
  a credential management app on
  unmanaged devices.
Changes
* Show FAB for detailed/long manage credentials
  authentication policy.
* Hide FAB for short manage credentials
  authentication policy.
* Unexpand FAB once the user start starts
  scrolling.
* Hide FAB once the user has scrolled to
  the bottom.

Manual Testing
* Verify FAB is shown for a detailed/long policy:
  https://screenshot.googleplex.com/BUb4LGz3GD6AozS
* Verify FAB is hidden for a short policy
* Verify FAB is hidden when user has scrolled to the
  bottom:
  https://screenshot.googleplex.com/6FQRqto3r3jzfXH
* Verify FAB is unexpanded (text hidden)
  when the users start scrolling:
  https://screenshot.googleplex.com/4FfAt5MsCfrAwQK

Bug: 165641221
Test: Manual Testing
      make RunSettingsRoboTests -j ROBOTEST_FILTER=com.android.settings.security.RequestManageCredentialsTest
Change-Id: Ied2ef726ad4dcc3f92c20249f80294f0a3071a8a
This commit is contained in:
Alex Johnston
2020-12-01 20:36:38 +00:00
parent 580b7af1a4
commit a12b402f36
4 changed files with 65 additions and 0 deletions

View File

@@ -0,0 +1,25 @@
<!--
~ Copyright (C) 2020 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.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?android:attr/colorAccent">
<path
android:fillColor="@android:color/white"
android:pathData="M20,12l-1.41,-1.41L13,16.17V4h-2v12.17l-5.58,-5.59L4,12l8,8 8,-8z"/>
</vector>

View File

@@ -59,4 +59,17 @@
</RelativeLayout> </RelativeLayout>
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
android:id="@+id/extended_fab"
style="@style/RequestManageCredentialsFab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/request_manage_credentials_more"
app:layout_anchor="@id/apps_list"
app:layout_anchorGravity="bottom|center"
app:elevation="3dp"
app:icon="@drawable/ic_arrow_downward"
app:iconTint="?android:attr/colorAccent"
app:backgroundTint="?android:attr/colorPrimary"/>
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -805,6 +805,13 @@
<item name="android:textColor">?android:attr/colorAccent</item> <item name="android:textColor">?android:attr/colorAccent</item>
</style> </style>
<style name="RequestManageCredentialsFab">
<item name="android:textSize">14sp</item>
<item name="android:textAllCaps">false</item>
<item name="android:textColor">?android:attr/colorAccent</item>
<item name="android:layout_marginBottom">12dp</item>
</style>
<style name="RequestManageCredentialsHeader"> <style name="RequestManageCredentialsHeader">
<item name="android:paddingStart">40dp</item> <item name="android:paddingStart">40dp</item>
<item name="android:paddingEnd">24dp</item> <item name="android:paddingEnd">24dp</item>

View File

@@ -35,6 +35,8 @@ import androidx.recyclerview.widget.RecyclerView;
import com.android.settings.R; import com.android.settings.R;
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
/** /**
* Displays a full screen to the user asking whether the calling app can manage the user's * Displays a full screen to the user asking whether the calling app can manage the user's
* KeyChain credentials. This screen includes the authentication policy highlighting what apps and * KeyChain credentials. This screen includes the authentication policy highlighting what apps and
@@ -62,6 +64,7 @@ public class RequestManageCredentials extends Activity {
private RecyclerView mRecyclerView; private RecyclerView mRecyclerView;
private LinearLayoutManager mLayoutManager; private LinearLayoutManager mLayoutManager;
private LinearLayout mButtonPanel; private LinearLayout mButtonPanel;
private ExtendedFloatingActionButton mExtendedFab;
private boolean mDisplayingButtonPanel = false; private boolean mDisplayingButtonPanel = false;
@@ -79,6 +82,7 @@ public class RequestManageCredentials extends Activity {
loadRecyclerView(); loadRecyclerView();
loadButtons(); loadButtons();
loadExtendedFloatingActionButton();
addOnScrollListener(); addOnScrollListener();
} else { } else {
Log.e(TAG, "Unable to start activity because intent action is not " Log.e(TAG, "Unable to start activity because intent action is not "
@@ -106,6 +110,15 @@ public class RequestManageCredentials extends Activity {
allowButton.setOnClickListener(setCredentialManagementApp()); allowButton.setOnClickListener(setCredentialManagementApp());
} }
private void loadExtendedFloatingActionButton() {
mExtendedFab = findViewById(R.id.extended_fab);
mExtendedFab.setOnClickListener(v -> {
mRecyclerView.scrollToPosition(mAuthenticationPolicy.getAppAndUriMappings().size());
mExtendedFab.hide();
showButtonPanel();
});
}
private View.OnClickListener finishRequestManageCredentials() { private View.OnClickListener finishRequestManageCredentials() {
return v -> { return v -> {
Toast.makeText(this, R.string.request_manage_credentials_dont_allow, Toast.makeText(this, R.string.request_manage_credentials_dont_allow,
@@ -130,9 +143,16 @@ public class RequestManageCredentials extends Activity {
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy); super.onScrolled(recyclerView, dx, dy);
if (!mDisplayingButtonPanel) { if (!mDisplayingButtonPanel) {
// On down scroll, hide text in floating action button by setting
// extended to false.
if (dy > 0 && mExtendedFab.getVisibility() == View.VISIBLE) {
mExtendedFab.setExtended(false);
}
if (isRecyclerScrollable()) { if (isRecyclerScrollable()) {
mExtendedFab.show();
hideButtonPanel(); hideButtonPanel();
} else { } else {
mExtendedFab.hide();
showButtonPanel(); showButtonPanel();
} }
} }