OSDN Git Service

Move edit icon from header to action bar
authorhjchangliao <hjchangliao@google.com>
Tue, 8 Jan 2019 08:44:26 +0000 (16:44 +0800)
committerhjchangliao <hjchangliao@google.com>
Fri, 11 Jan 2019 23:36:32 +0000 (07:36 +0800)
Move edit icon in bluetooth detail page,
from header back to action bar.

Change-Id: I6afd7c611fe4db8c6c27921b5da316d8a1a000db
Fixes: 76206922
Test: make RunSettingsRoboTests

src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java
src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsHeaderControllerTest.java
tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java

index 11bd174..18aeaa0 100644 (file)
@@ -73,16 +73,6 @@ public class BluetoothDetailsHeaderController extends BluetoothDetailsController
         mHeaderController.setIcon(pair.first);
         mHeaderController.setIconContentDescription(pair.second);
         mHeaderController.setSummary(summaryText);
-        mHeaderController.setEditListener(v -> showEditDeviceNameDialog());
-        mHeaderController.setButtonActions(
-                EntityHeaderController.ActionType.ACTION_EDIT_PREFERENCE,
-                EntityHeaderController.ActionType.ACTION_NONE);
-    }
-
-    @VisibleForTesting
-    void showEditDeviceNameDialog() {
-        RemoteDeviceNameDialogFragment.newInstance(mCachedDevice).show(
-                mFragment.getFragmentManager(), RemoteDeviceNameDialogFragment.TAG);
     }
 
     @Override
index 43de5a4..b2f917b 100644 (file)
@@ -24,6 +24,9 @@ import android.os.Bundle;
 import android.util.FeatureFlagUtils;
 
 import androidx.annotation.VisibleForTesting;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
@@ -43,6 +46,9 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment
     public static final String KEY_DEVICE_ADDRESS = "device_address";
     private static final String TAG = "BTDeviceDetailsFrg";
 
+    @VisibleForTesting
+    static int EDIT_DEVICE_NAME_ITEM_ID = Menu.FIRST;
+
     /**
      * An interface to let tests override the normal mechanism for looking up the
      * CachedBluetoothDevice and LocalBluetoothManager, and substitute their own mocks instead.
@@ -127,6 +133,24 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment
     }
 
     @Override
+    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+        MenuItem item = menu.add(0, EDIT_DEVICE_NAME_ITEM_ID, 0, R.string.bluetooth_rename_button);
+        item.setIcon(R.drawable.ic_mode_edit);
+        item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
+        super.onCreateOptionsMenu(menu, inflater);
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem menuItem) {
+        if (menuItem.getItemId() == EDIT_DEVICE_NAME_ITEM_ID) {
+            RemoteDeviceNameDialogFragment.newInstance(mCachedDevice).show(
+                    getFragmentManager(), RemoteDeviceNameDialogFragment.TAG);
+            return true;
+        }
+        return super.onOptionsItemSelected(menuItem);
+    }
+
+    @Override
     protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
         ArrayList<AbstractPreferenceController> controllers = new ArrayList<>();
 
index 00ae697..1e78075 100644 (file)
@@ -44,7 +44,6 @@ import org.junit.After;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
-import org.mockito.ArgumentCaptor;
 import org.mockito.InOrder;
 import org.mockito.Mock;
 import org.robolectric.RobolectricTestRunner;
@@ -104,10 +103,6 @@ public class BluetoothDetailsHeaderControllerTest extends BluetoothDetailsContro
         verify(mHeaderController).setIconContentDescription(any(String.class));
         verify(mHeaderController).setSummary(any(String.class));
         verify(mHeaderController).setSecondSummary(any(String.class));
-        verify(mHeaderController).setEditListener(any(View.OnClickListener.class));
-        verify(mHeaderController).setButtonActions(
-                EntityHeaderController.ActionType.ACTION_EDIT_PREFERENCE,
-                EntityHeaderController.ActionType.ACTION_NONE);
         verify(mHeaderController).done(mActivity, true);
     }
 
@@ -130,20 +125,4 @@ public class BluetoothDetailsHeaderControllerTest extends BluetoothDetailsContro
         inOrder.verify(mHeaderController)
             .setSummary(mContext.getString(R.string.bluetooth_connecting));
     }
-
-    @Test
-    public void invokeShowEditDeviceNameDialog_showDialog() {
-        showScreen(mController);
-
-        FragmentManager fragmentManager = mock(FragmentManager.class);
-        when(mFragment.getFragmentManager()).thenReturn(fragmentManager);
-        FragmentTransaction ft = mock(FragmentTransaction.class);
-        when(fragmentManager.beginTransaction()).thenReturn(ft);
-
-        ArgumentCaptor<Fragment> captor = ArgumentCaptor.forClass(Fragment.class);
-        mController.showEditDeviceNameDialog();
-        verify(ft).add(captor.capture(), eq(RemoteDeviceNameDialogFragment.TAG));
-        RemoteDeviceNameDialogFragment dialog = (RemoteDeviceNameDialogFragment) captor.getValue();
-        assertThat(dialog).isNotNull();
-    }
 }
index be77283..c9d8201 100644 (file)
@@ -19,15 +19,24 @@ package com.android.settings.bluetooth;
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
 import android.os.Bundle;
+import android.view.MenuInflater;
+import android.view.MenuItem;
 
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
 import androidx.preference.PreferenceScreen;
 
+import com.android.settings.R;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -36,10 +45,12 @@ import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
+import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.fakes.RoboMenu;
 
 @RunWith(RobolectricTestRunner.class)
 public class BluetoothDeviceDetailsFragmentTest {
@@ -48,6 +59,9 @@ public class BluetoothDeviceDetailsFragmentTest {
 
     private BluetoothDeviceDetailsFragment mFragment;
     private Context mContext;
+    private RoboMenu mMenu;
+    private MenuInflater mInflater;
+    private FragmentTransaction mFragmentTransaction;
 
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private CachedBluetoothDevice mCachedDevice;
@@ -67,11 +81,19 @@ public class BluetoothDeviceDetailsFragmentTest {
         doReturn(mCachedDevice).when(mFragment).getCachedDevice(any());
         doReturn(mPreferenceScreen).when(mFragment).getPreferenceScreen();
 
+        FragmentManager fragmentManager = mock(FragmentManager.class);
+        when(mFragment.getFragmentManager()).thenReturn(fragmentManager);
+        mFragmentTransaction = mock(FragmentTransaction.class);
+        when(fragmentManager.beginTransaction()).thenReturn(mFragmentTransaction);
+
         when(mCachedDevice.getAddress()).thenReturn(TEST_ADDRESS);
         Bundle args = new Bundle();
         args.putString(BluetoothDeviceDetailsFragment.KEY_DEVICE_ADDRESS, TEST_ADDRESS);
         mFragment.setArguments(args);
         mFragment.onAttach(mContext);
+
+        mMenu = new RoboMenu(mContext);
+        mInflater = new MenuInflater(mContext);
     }
 
     @Test
@@ -80,4 +102,28 @@ public class BluetoothDeviceDetailsFragmentTest {
         assertThat(mFragment.mManager).isEqualTo(mLocalManager);
         assertThat(mFragment.mCachedDevice).isEqualTo(mCachedDevice);
     }
+
+    @Test
+    public void getTitle_displayEditTitle() {
+        mFragment.onCreateOptionsMenu(mMenu, mInflater);
+
+        final MenuItem item = mMenu.getItem(0);
+
+        assertThat(item.getTitle()).isEqualTo(mContext.getString(R.string.bluetooth_rename_button));
+    }
+
+    @Test
+    public void editMenu_clicked_showDialog() {
+        mFragment.onCreateOptionsMenu(mMenu, mInflater);
+        final MenuItem item = mMenu.getItem(0);
+        ArgumentCaptor<Fragment> captor = ArgumentCaptor.forClass(Fragment.class);
+
+        mFragment.onOptionsItemSelected(item);
+
+        assertThat(item.getItemId())
+            .isEqualTo(BluetoothDeviceDetailsFragment.EDIT_DEVICE_NAME_ITEM_ID);
+        verify(mFragmentTransaction).add(captor.capture(), eq(RemoteDeviceNameDialogFragment.TAG));
+        RemoteDeviceNameDialogFragment dialog = (RemoteDeviceNameDialogFragment) captor.getValue();
+        assertThat(dialog).isNotNull();
+    }
 }