diff options
| author | 2018-05-02 00:33:17 -0700 | |
|---|---|---|
| committer | 2018-05-02 11:22:05 -0700 | |
| commit | 0cf5e4a0651b4f418788754e416cc468be2cc5c1 (patch) | |
| tree | e1070382ee2f9d4494c228224799009bcf47dde2 | |
| parent | 9f88bbc0642ae8e16c40d1e88ea0d82ed1a6316c (diff) | |
Fix NPE when casting
We didn't have any tests that guarantee that the keyguard casting flow
wouldn't be broken by updates on KeyguardStatusView.
Such test was created
Test: atest packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardPresentationTest.java
Change-Id: I44f66be770ea2263fbf183bc438d1cedaa6f589a
Fixes: 71696859
3 files changed, 87 insertions, 21 deletions
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_presentation.xml b/packages/SystemUI/res-keyguard/layout/keyguard_presentation.xml index 3193101a8322..87983b9186db 100644 --- a/packages/SystemUI/res-keyguard/layout/keyguard_presentation.xml +++ b/packages/SystemUI/res-keyguard/layout/keyguard_presentation.xml @@ -20,39 +20,54 @@ <!-- This is a view that shows general status information in Keyguard. --> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:androidprv="http://schemas.android.com/apk/res-auto" android:id="@+id/presentation" android:layout_width="match_parent" android:layout_height="match_parent"> - + <!-- This is mostly keyguard_status_view.xml with minor modifications --> <com.android.keyguard.KeyguardStatusView android:id="@+id/clock" android:orientation="vertical" - android:layout_width="wrap_content" + android:layout_width="410dp" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="center_horizontal|top" - android:orientation="vertical" - android:focusable="true"> - <TextClock - android:id="@+id/clock_view" - android:layout_width="wrap_content" + android:orientation="vertical"> + <RelativeLayout + android:id="@+id/keyguard_clock_container" + android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="center_horizontal|top" - android:textColor="?attr/wallpaperTextColor" - android:singleLine="true" - style="@style/widget_big_thin" - android:format12Hour="@string/keyguard_widget_12_hours_format" - android:format24Hour="@string/keyguard_widget_24_hours_format" - android:baselineAligned="true" /> - - <include layout="@layout/keyguard_status_area" /> + android:layout_gravity="center_horizontal|top"> + <TextClock + android:id="@+id/clock_view" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:layout_centerHorizontal="true" + android:layout_alignParentTop="true" + android:letterSpacing="0.03" + android:textColor="?attr/wallpaperTextColor" + android:singleLine="true" + style="@style/widget_big_thin" + android:format12Hour="@string/keyguard_widget_12_hours_format" + android:format24Hour="@string/keyguard_widget_24_hours_format" /> + <View + android:id="@+id/clock_separator" + android:layout_width="@dimen/widget_separator_width" + android:layout_height="@dimen/widget_separator_thickness" + android:layout_below="@id/clock_view" + android:background="#f00" + android:layout_centerHorizontal="true" /> + <include layout="@layout/keyguard_status_area" + android:id="@+id/keyguard_status_area" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@id/clock_separator" /> + </RelativeLayout> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="10dip" + android:layout_marginTop="@dimen/widget_vertical_padding" android:layout_gravity="center_horizontal" android:src="@drawable/kg_security_lock_normal" /> </LinearLayout> diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java index 727b62b4b79d..454528e4f5f6 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java @@ -164,7 +164,9 @@ public class KeyguardStatusView extends GridLayout implements protected void onFinishInflate() { super.onFinishInflate(); mLogoutView = findViewById(R.id.logout); - mLogoutView.setOnClickListener(this::onLogoutClicked); + if (mLogoutView != null) { + mLogoutView.setOnClickListener(this::onLogoutClicked); + } mClockView = findViewById(R.id.clock_view); mClockView.setShowCurrentUserTime(true); @@ -296,6 +298,9 @@ public class KeyguardStatusView extends GridLayout implements } public int getLogoutButtonHeight() { + if (mLogoutView == null) { + return 0; + } return mLogoutView.getVisibility() == VISIBLE ? mLogoutView.getHeight() : 0; } @@ -304,6 +309,9 @@ public class KeyguardStatusView extends GridLayout implements } private void updateLogoutView() { + if (mLogoutView == null) { + return; + } mLogoutView.setVisibility(shouldShowLogout() ? VISIBLE : GONE); // Logout button will stay in language of user 0 if we don't set that manually. mLogoutView.setText(mContext.getResources().getString( @@ -390,7 +398,9 @@ public class KeyguardStatusView extends GridLayout implements private void updateDark() { boolean dark = mDarkAmount == 1; - mLogoutView.setAlpha(dark ? 0 : 1); + if (mLogoutView != null) { + mLogoutView.setAlpha(dark ? 0 : 1); + } if (mOwnerInfo != null) { boolean hasText = !TextUtils.isEmpty(mOwnerInfo.getText()); mOwnerInfo.setVisibility(hasText && mDarkAmount != 1 ? VISIBLE : GONE); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardPresentationTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardPresentationTest.java new file mode 100644 index 000000000000..54291536093c --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardPresentationTest.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2018 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.systemui.statusbar.phone; + +import android.support.test.filters.SmallTest; +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper; +import android.view.LayoutInflater; +import android.view.View; + +import com.android.systemui.R; +import com.android.systemui.SysuiTestCase; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; + +@SmallTest +@RunWith(AndroidTestingRunner.class) +@TestableLooper.RunWithLooper(setAsMainLooper = true) +public class KeyguardPresentationTest extends SysuiTestCase { + @Test + public void testInflation_doesntCrash() { + LayoutInflater inflater = LayoutInflater.from(getContext()); + inflater.inflate(R.layout.keyguard_presentation, null); + } +} |