diff --git a/src/com/android/settings/applications/LayoutPreference.java b/src/com/android/settings/applications/LayoutPreference.java index b958b3a5450..b823f8ea815 100644 --- a/src/com/android/settings/applications/LayoutPreference.java +++ b/src/com/android/settings/applications/LayoutPreference.java @@ -18,6 +18,7 @@ package com.android.settings.applications; import android.content.Context; import android.content.res.TypedArray; +import android.support.annotation.VisibleForTesting; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceViewHolder; import android.util.AttributeSet; @@ -31,7 +32,10 @@ import com.android.settings.Utils; public class LayoutPreference extends Preference { - private View mRootView; + private final View.OnClickListener mClickListener = v -> performClick(v); + + @VisibleForTesting + View mRootView; public LayoutPreference(Context context, AttributeSet attrs) { super(context, attrs); @@ -59,7 +63,7 @@ public class LayoutPreference extends Preference { private void setView(View view) { setLayoutResource(R.layout.layout_preference_frame); - final ViewGroup allDetails = (ViewGroup) view.findViewById(R.id.all_details); + final ViewGroup allDetails = view.findViewById(R.id.all_details); if (allDetails != null) { Utils.forceCustomPadding(allDetails, true /* additive padding */); } @@ -68,9 +72,14 @@ public class LayoutPreference extends Preference { } @Override - public void onBindViewHolder(PreferenceViewHolder view) { - super.onBindViewHolder(view); - FrameLayout layout = (FrameLayout) view.itemView; + public void onBindViewHolder(PreferenceViewHolder holder) { + holder.itemView.setOnClickListener(mClickListener); + + final boolean selectable = isSelectable(); + holder.itemView.setFocusable(selectable); + holder.itemView.setClickable(selectable); + + FrameLayout layout = (FrameLayout) holder.itemView; layout.removeAllViews(); ViewGroup parent = (ViewGroup) mRootView.getParent(); if (parent != null) { diff --git a/tests/robotests/src/com/android/settings/applications/LayoutPreferenceTest.java b/tests/robotests/src/com/android/settings/applications/LayoutPreferenceTest.java new file mode 100644 index 00000000000..04d4342cd32 --- /dev/null +++ b/tests/robotests/src/com/android/settings/applications/LayoutPreferenceTest.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2017 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. + */ + +package com.android.settings.applications; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +import android.content.Context; +import android.support.v7.preference.Preference.OnPreferenceClickListener; +import android.support.v7.preference.PreferenceViewHolder; +import android.view.LayoutInflater; +import android.view.View; + +import com.android.settings.R; +import com.android.settings.SettingsRobolectricTestRunner; +import com.android.settings.TestConfig; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +public class LayoutPreferenceTest { + + private Context mContext; + private LayoutPreference mPreference; + private View mRootView; + private PreferenceViewHolder mHolder; + + @Before + public void setUp() { + mContext = RuntimeEnvironment.application; + mPreference = new LayoutPreference(mContext, R.layout.app_action_buttons); + mRootView = mPreference.mRootView; + mHolder = PreferenceViewHolder.createInstanceForTests(LayoutInflater.from(mContext) + .inflate(R.layout.layout_preference_frame, null, false)); + } + + @Test + public void setOnClickListener_shouldAttachToRootView() { + final OnPreferenceClickListener listener = mock(OnPreferenceClickListener.class); + + mPreference.setOnPreferenceClickListener(listener); + mPreference.onBindViewHolder(mHolder); + + mHolder.itemView.callOnClick(); + + verify(listener).onPreferenceClick(mPreference); + assertThat(mHolder.itemView.isFocusable()).isTrue(); + assertThat(mHolder.itemView.isClickable()).isTrue(); + } + + @Test + public void setNonSelectable_viewShouldNotBeSelectable() { + mPreference.setSelectable(false); + mPreference.onBindViewHolder(mHolder); + + assertThat(mHolder.itemView.isFocusable()).isFalse(); + assertThat(mHolder.itemView.isClickable()).isFalse(); + } + + @Test + public void disableSomeView_shouldMaintainStateAfterBind() { + mPreference.findViewById(R.id.left_button).setEnabled(false); + mPreference.findViewById(R.id.right_button).setEnabled(true); + + mPreference.onBindViewHolder(mHolder); + + assertThat(mPreference.findViewById(R.id.left_button).isEnabled()).isFalse(); + assertThat(mPreference.findViewById(R.id.right_button).isEnabled()).isTrue(); + } +}