Make DevicePolicyGroupLiveData downstream of ProviderNameLiveData

The DevicePolicyGroup List will be available to RecyclerView after
provider name is retrived, so that we will not update the
RecyclerView when it is doing layout.

Bug: 281527094
Bug: 282963899
Test: local
Change-Id: I2c5e615012949f2eb10fd150acfd63a569330e44
diff --git a/DeviceLockController/src/com/android/devicelockcontroller/activities/DevicePoliciesFragment.java b/DeviceLockController/src/com/android/devicelockcontroller/activities/DevicePoliciesFragment.java
index be8211a..2f3bf66 100644
--- a/DeviceLockController/src/com/android/devicelockcontroller/activities/DevicePoliciesFragment.java
+++ b/DeviceLockController/src/com/android/devicelockcontroller/activities/DevicePoliciesFragment.java
@@ -68,7 +68,10 @@
         RecyclerView recyclerView = view.findViewById(R.id.recyclerview_device_policy_group);
         DevicePolicyGroupListAdapter adapter = new DevicePolicyGroupListAdapter();
         viewModel.mDevicePolicyGroupListLiveData.observe(getViewLifecycleOwner(),
-                adapter::submitList);
+                devicePolicyGroups -> {
+                    adapter.setProviderName(viewModel.mProviderNameLiveData.getValue());
+                    adapter.submitList(devicePolicyGroups);
+                });
         checkNotNull(recyclerView);
         recyclerView.setAdapter(adapter);
 
diff --git a/DeviceLockController/src/com/android/devicelockcontroller/activities/DevicePoliciesViewModel.java b/DeviceLockController/src/com/android/devicelockcontroller/activities/DevicePoliciesViewModel.java
index 0ee65c1..a2cf529 100644
--- a/DeviceLockController/src/com/android/devicelockcontroller/activities/DevicePoliciesViewModel.java
+++ b/DeviceLockController/src/com/android/devicelockcontroller/activities/DevicePoliciesViewModel.java
@@ -16,6 +16,7 @@
 
 package com.android.devicelockcontroller.activities;
 
+import androidx.lifecycle.MediatorLiveData;
 import androidx.lifecycle.MutableLiveData;
 import androidx.lifecycle.ViewModel;
 
@@ -84,7 +85,7 @@
     final MutableLiveData<String> mProviderNameLiveData;
     final MutableLiveData<Integer> mHeaderDrawableIdLiveData;
     final MutableLiveData<Integer> mHeaderTextIdLiveData;
-    final MutableLiveData<List<DevicePolicyGroup>> mDevicePolicyGroupListLiveData;
+    final MediatorLiveData<List<DevicePolicyGroup>> mDevicePolicyGroupListLiveData;
     final MutableLiveData<Integer> mFooterTextIdLiveData;
 
     public DevicePoliciesViewModel() {
@@ -103,7 +104,9 @@
                 }, MoreExecutors.directExecutor());
         mHeaderDrawableIdLiveData = new MutableLiveData<>(HEADER_DRAWABLE_ID);
         mHeaderTextIdLiveData = new MutableLiveData<>(HEADER_TEXT_ID);
-        mDevicePolicyGroupListLiveData = new MutableLiveData<>(DEVICE_POLICY_GROUPS);
+        mDevicePolicyGroupListLiveData = new MediatorLiveData<>();
+        mDevicePolicyGroupListLiveData.addSource(mProviderNameLiveData,
+                unused -> mDevicePolicyGroupListLiveData.setValue(DEVICE_POLICY_GROUPS));
         mFooterTextIdLiveData = new MutableLiveData<>(FOOTER_TEXT_ID);
     }
 }
diff --git a/DeviceLockController/src/com/android/devicelockcontroller/activities/DevicePolicyGroupListAdapter.java b/DeviceLockController/src/com/android/devicelockcontroller/activities/DevicePolicyGroupListAdapter.java
index 353c933..2fdbd47 100644
--- a/DeviceLockController/src/com/android/devicelockcontroller/activities/DevicePolicyGroupListAdapter.java
+++ b/DeviceLockController/src/com/android/devicelockcontroller/activities/DevicePolicyGroupListAdapter.java
@@ -25,13 +25,8 @@
 import androidx.recyclerview.widget.ListAdapter;
 
 import com.android.devicelockcontroller.R;
-import com.android.devicelockcontroller.storage.SetupParametersClient;
 import com.android.devicelockcontroller.util.LogUtil;
 
-import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.MoreExecutors;
-
 import org.jetbrains.annotations.Nullable;
 
 import java.util.List;
@@ -89,19 +84,9 @@
         if (!TextUtils.isEmpty(mProviderName)) {
             devicePolicyGroupViewHolder.bind(getItem(position), mMaxDevicePolicy, mProviderName);
         } else {
-            Futures.addCallback(SetupParametersClient.getInstance().getKioskAppProviderName(),
-                    new FutureCallback<>() {
-                        @Override
-                        public void onSuccess(String result) {
-                            mProviderName = result;
-                            notifyItemChanged(position);
-                        }
-
-                        @Override
-                        public void onFailure(Throwable t) {
-                            LogUtil.e(TAG, "Failed to get device provider name!", t);
-                        }
-                    }, MoreExecutors.directExecutor());
+            LogUtil.e(TAG,
+                    "Provider name is not set, call setProviderName(String) first before "
+                            + "submitList(List)");
         }
     }
 
@@ -117,4 +102,9 @@
                     devicePolicyGroup.getDevicePolicyList().size());
         }
     }
+
+    public void setProviderName(String providerName) {
+        mProviderName = providerName;
+        notifyDataSetChanged();
+    }
 }