OSDN Git Service

Fix "Send feedback about this device" option is missing issue.
authorwayneyang <wayneyang@google.com>
Wed, 21 Mar 2018 12:05:09 +0000 (20:05 +0800)
committerwayneyang <wayneyang@google.com>
Thu, 22 Mar 2018 01:56:28 +0000 (09:56 +0800)
When device restart & launching "Feedback" from lock screen,
the "send feedback" option will be missing. It's because
the report package cannot be found by calling from lock screen.
Update the option visibility after updatestate and add test case.

Bug: 74076963
Test: Manual test and RunSettingsRoboTests:FeedbackPreferenceControllerTest
Change-Id: I105d6f90da499423b6881f2ba808e69bd2e8595d

src/com/android/settings/deviceinfo/FeedbackPreferenceController.java
tests/robotests/src/com/android/settings/deviceinfo/FeedbackPreferenceControllerTest.java

index 2d8941d..e2e2e2a 100644 (file)
@@ -38,6 +38,7 @@ public class FeedbackPreferenceController extends AbstractPreferenceController i
         intent = new Intent("android.intent.action.BUG_REPORT");
     }
 
+    @Override
     public boolean isAvailable() {
         return !TextUtils.isEmpty(DeviceInfoUtils.getFeedbackReporterPackage(mContext));
     }
@@ -47,6 +48,15 @@ public class FeedbackPreferenceController extends AbstractPreferenceController i
         super.updateState(preference);
         intent.setPackage(DeviceInfoUtils.getFeedbackReporterPackage(mContext));
         preference.setIntent(intent);
+
+        // In some cases, cannot retrieve the report package from package manager,
+        // For example, launched from lock screen.
+        // Update this preference visibility after updateState.
+        if (isAvailable() && !preference.isVisible()) {
+            preference.setVisible(true);
+        } else if (!isAvailable() && preference.isVisible()){
+            preference.setVisible(false);
+        }
     }
 
     public String getPreferenceKey() {
index 45cfb28..7a75cd5 100644 (file)
@@ -21,6 +21,8 @@ import static org.mockito.Mockito.when;
 
 import android.app.Fragment;
 import android.content.Context;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
 
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
@@ -38,12 +40,19 @@ public class FeedbackPreferenceControllerTest {
     private Fragment mFragment;
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private Context mContext;
+    @Mock
+    private Preference mPreference;
+    @Mock
+    private PreferenceScreen mScreen;
+
     private FeedbackPreferenceController mController;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mController = new FeedbackPreferenceController(mFragment, mContext);
+        final String prefKey = mController.getPreferenceKey();
+        when(mScreen.findPreference(prefKey)).thenReturn(mPreference);
     }
 
     @Test
@@ -51,4 +60,10 @@ public class FeedbackPreferenceControllerTest {
         when(mContext.getResources().getString(anyInt())).thenReturn("");
         assertThat(mController.isAvailable()).isFalse();
     }
+
+    @Test
+    public void isVisible_afterUpdateState_shouldBeSameAsIsAvailable() {
+        mController.updateState(mPreference);
+        assertThat(mPreference.isVisible()).isEqualTo(mController.isAvailable());
+    }
 }