Merge "Integrate keyguard paging hint" into jb-mr1-dev

This commit is contained in:
Adam Cohen
2012-09-30 12:21:21 -07:00
committed by Android (Google) Code Review
14 changed files with 302 additions and 45 deletions

View File

@@ -27,20 +27,10 @@
android:gravity="center_vertical" android:gravity="center_vertical"
android:orientation="horizontal"> android:orientation="horizontal">
<com.android.internal.policy.impl.keyguard.KeyguardWidgetPager <include layout="@layout/keyguard_widget_region"
android:id="@+id/app_widget_container"
android:layout_width="0dip" android:layout_width="0dip"
android:layout_height="230dip" android:layout_height="230dip"
android:gravity="center" android:layout_weight=".45"/>
android:layout_weight=".45"
android:visibility="gone">
<!-- TODO: Remove this once supported as a widget -->
<include layout="@layout/keyguard_status_view"/>
<include layout="@layout/keyguard_transport_control_view"/>
</com.android.internal.policy.impl.keyguard.KeyguardWidgetPager>
<com.android.internal.policy.impl.keyguard.KeyguardSecurityViewFlipper <com.android.internal.policy.impl.keyguard.KeyguardSecurityViewFlipper
android:id="@+id/view_flipper" android:id="@+id/view_flipper"

View File

@@ -26,18 +26,10 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="horizontal"> android:orientation="horizontal">
<com.android.internal.policy.impl.keyguard.KeyguardWidgetPager <include layout="@layout/keyguard_widget_region"
android:id="@+id/app_widget_container"
android:layout_width="0dip" android:layout_width="0dip"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"/>
android:visibility="gone">
<!-- TODO: Remove this once supported as a widget -->
<include layout="@layout/keyguard_status_view"/>
<include layout="@layout/keyguard_transport_control_view"/>
</com.android.internal.policy.impl.keyguard.KeyguardWidgetPager>
<FrameLayout <FrameLayout
android:layout_width="0dip" android:layout_width="0dip"

View File

@@ -27,18 +27,10 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:gravity="center_horizontal"> android:gravity="center_horizontal">
<com.android.internal.policy.impl.keyguard.KeyguardWidgetPager <include layout="@layout/keyguard_widget_region"
android:id="@+id/app_widget_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dip" android:layout_height="0dip"
android:layout_weight="0.4" android:layout_weight="0.4"/>
android:visibility="gone">
<!-- TODO: Remove this once supported as a widget -->
<include layout="@layout/keyguard_status_view"/>
<include layout="@layout/keyguard_transport_control_view"/>
</com.android.internal.policy.impl.keyguard.KeyguardWidgetPager>
<com.android.internal.policy.impl.keyguard.KeyguardSecurityViewFlipper <com.android.internal.policy.impl.keyguard.KeyguardSecurityViewFlipper
android:id="@+id/view_flipper" android:id="@+id/view_flipper"

View File

@@ -26,19 +26,13 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical">
<com.android.internal.policy.impl.keyguard.KeyguardWidgetPager <include layout="@layout/keyguard_widget_region"
android:id="@+id/app_widget_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dip" android:layout_height="0dip"
android:layout_weight="0.45" android:layout_weight="0.45"
android:layout_marginTop="35dip" android:layout_marginTop="35dip"
android:layout_marginLeft="33dip" android:layout_marginLeft="33dip"
android:layout_marginRight="33dip" android:layout_marginRight="33dip"/>
android:visibility="gone">
<!-- TODO: Remove this when supported as a widget -->
<include layout="@layout/keyguard_status_view"/>
<include layout="@layout/keyguard_transport_control_view"/>
</com.android.internal.policy.impl.keyguard.KeyguardWidgetPager>
<RelativeLayout <RelativeLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"

View File

@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
**
** Copyright 2012, 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.
*/
-->
<!-- This is the selector widget that allows the user to select an action. -->
<com.android.internal.policy.impl.keyguard.KeyguardWidgetRegion
xmlns:prvandroid="http://schemas.android.com/apk/prv/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/kg_widget_region"
android:visibility="gone"
android:gravity="center"
android:orientation="vertical">
<Space
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1" />
<com.android.internal.policy.impl.keyguard.KeyguardWidgetPager
android:id="@+id/app_widget_container"
android:layout_width="match_parent"
android:layout_height="@dimen/kg_widget_container_height">
<!-- TODO: Remove this when supported as a widget -->
<include layout="@layout/keyguard_status_view"/>
<include layout="@layout/keyguard_transport_control_view"/>
</com.android.internal.policy.impl.keyguard.KeyguardWidgetPager>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:orientation="horizontal">
<com.android.internal.policy.impl.keyguard.KeyguardGlowStripView
android:id="@+id/left_strip"
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="1"
prvandroid:numDots="5"
prvandroid:dotSize="7dip"
prvandroid:leftToRight="false"
prvandroid:glowDot="@*android:drawable/ic_lockscreen_glowdot" />
<Space
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="1"/>
<com.android.internal.policy.impl.keyguard.KeyguardGlowStripView
android:id="@+id/right_strip"
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="1"
prvandroid:numDots="5"
prvandroid:dotSize="7dip"
prvandroid:leftToRight="true"
prvandroid:glowDot="@*android:drawable/ic_lockscreen_glowdot" />
</LinearLayout>
</com.android.internal.policy.impl.keyguard.KeyguardWidgetRegion>

View File

@@ -5772,4 +5772,11 @@
<attr name="scrollIndicatorPaddingRight" format="dimension" /> <attr name="scrollIndicatorPaddingRight" format="dimension" />
</declare-styleable> </declare-styleable>
<declare-styleable name="KeyguardGlowStripView">
<attr name="dotSize" format="dimension" />
<attr name="numDots" format="integer" />
<attr name="glowDot" format="reference" />
<attr name="leftToRight" format="boolean" />
</declare-styleable>
</resources> </resources>

View File

@@ -285,6 +285,9 @@
<!-- Space reserved at the bottom of secure views (pin/pattern/password/SIM pin/SIM puk) --> <!-- Space reserved at the bottom of secure views (pin/pattern/password/SIM pin/SIM puk) -->
<dimen name="kg_secure_padding_height">46dp</dimen> <dimen name="kg_secure_padding_height">46dp</dimen>
<!-- The height of the widget container -->
<dimen name="kg_widget_container_height">200dp</dimen>
<!-- Touch slop for the global toggle accessibility gesture --> <!-- Touch slop for the global toggle accessibility gesture -->
<dimen name="accessibility_touch_slop">80dip</dimen> <dimen name="accessibility_touch_slop">80dip</dimen>

View File

@@ -1075,6 +1075,7 @@
<java-symbol type="layout" name="notification_template_inbox" /> <java-symbol type="layout" name="notification_template_inbox" />
<java-symbol type="layout" name="keyguard_multi_user_avatar" /> <java-symbol type="layout" name="keyguard_multi_user_avatar" />
<java-symbol type="layout" name="keyguard_multi_user_selector_widget" /> <java-symbol type="layout" name="keyguard_multi_user_selector_widget" />
<java-symbol type="layout" name="keyguard_widget_region" />
<java-symbol type="layout" name="sms_short_code_confirmation_dialog" /> <java-symbol type="layout" name="sms_short_code_confirmation_dialog" />
<java-symbol type="anim" name="slide_in_child_bottom" /> <java-symbol type="anim" name="slide_in_child_bottom" />
@@ -1283,6 +1284,10 @@
<java-symbol type="id" name="keyguard_users_grid" /> <java-symbol type="id" name="keyguard_users_grid" />
<java-symbol type="id" name="clock_text" /> <java-symbol type="id" name="clock_text" />
<java-symbol type="id" name="clock_view" /> <java-symbol type="id" name="clock_view" />
<java-symbol type="id" name="kg_widget_region" />
<java-symbol type="id" name="left_strip" />
<java-symbol type="id" name="right_strip" />
<java-symbol type="integer" name="config_carDockRotation" /> <java-symbol type="integer" name="config_carDockRotation" />
<java-symbol type="integer" name="config_defaultUiModeType" /> <java-symbol type="integer" name="config_defaultUiModeType" />
<java-symbol type="integer" name="config_deskDockRotation" /> <java-symbol type="integer" name="config_deskDockRotation" />

View File

@@ -33,7 +33,6 @@ import android.widget.TextView;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.text.DateFormatSymbols; import java.text.DateFormatSymbols;
import java.util.Calendar; import java.util.Calendar;
import com.android.internal.R; import com.android.internal.R;
/** /**

View File

@@ -0,0 +1,139 @@
/*
* Copyright (C) 2012 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.internal.policy.impl.keyguard;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.Interpolator;
import android.view.animation.LinearInterpolator;
import android.widget.LinearLayout;
import com.android.internal.R;
/**
* A layout which animates a strip of horizontal, pulsing dots on request. This is used
* to indicate the presence of pages to the left / right.
*/
public class KeyguardGlowStripView extends LinearLayout {
private static final int DURATION = 500;
private static final float SLIDING_WINDOW_SIZE = 0.4f;
private int mDotStripTop;
private int mHorizontalDotGap;
private int mDotSize;
private int mNumDots;
private Drawable mDotDrawable;
private boolean mLeftToRight = true;
private float mAnimationProgress = 0f;
private boolean mDrawDots = false;
private ValueAnimator mAnimator;
private Interpolator mDotAlphaInterpolator = new DecelerateInterpolator(0.5f);
public KeyguardGlowStripView(Context context) {
this(context, null, 0);
}
public KeyguardGlowStripView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public KeyguardGlowStripView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.KeyguardGlowStripView);
mDotSize = a.getDimensionPixelSize(R.styleable.KeyguardGlowStripView_dotSize, mDotSize);
mNumDots = a.getInt(R.styleable.KeyguardGlowStripView_numDots, mNumDots);
mDotDrawable = a.getDrawable(R.styleable.KeyguardGlowStripView_glowDot);
mLeftToRight = a.getBoolean(R.styleable.KeyguardGlowStripView_leftToRight, mLeftToRight);
}
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
int availableWidth = w - getPaddingLeft() - getPaddingRight();
mHorizontalDotGap = (availableWidth - mDotSize * mNumDots) / (mNumDots - 1);
mDotStripTop = getPaddingTop();
invalidate();
}
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
if (!mDrawDots) return;
int xOffset = getPaddingLeft();
mDotDrawable.setBounds(0, 0, mDotSize, mDotSize);
for (int i = 0; i < mNumDots; i++) {
// We fudge the relative position to provide a fade in of the first dot and a fade
// out of the final dot.
float relativeDotPosition = SLIDING_WINDOW_SIZE / 2 + ((1.0f * i) / (mNumDots - 1)) *
(1 - SLIDING_WINDOW_SIZE);
float distance = Math.abs(relativeDotPosition - mAnimationProgress);
float alpha = Math.max(0, 1 - distance / (SLIDING_WINDOW_SIZE / 2));
alpha = mDotAlphaInterpolator.getInterpolation(alpha);
canvas.save();
canvas.translate(xOffset, mDotStripTop);
mDotDrawable.setAlpha((int) (alpha * 255));
mDotDrawable.draw(canvas);
canvas.restore();
xOffset += mDotSize + mHorizontalDotGap;
}
}
public void makeEmGo() {
if (mAnimator != null) {
mAnimator.cancel();
}
float from = mLeftToRight ? 0f : 1f;
float to = mLeftToRight ? 1f : 0f;
mAnimator = ValueAnimator.ofFloat(from, to);
mAnimator.setDuration(DURATION);
mAnimator.setInterpolator(new LinearInterpolator());
mAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mDrawDots = false;
// make sure we draw one frame at the end with everything gone.
invalidate();
}
@Override
public void onAnimationStart(Animator animation) {
mDrawDots = true;
}
});
mAnimator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
mAnimationProgress = (Float) animation.getAnimatedValue();
invalidate();
}
});
mAnimator.start();
}
}

View File

@@ -141,7 +141,8 @@ public class KeyguardHostView extends KeyguardViewBase {
@Override @Override
protected void onFinishInflate() { protected void onFinishInflate() {
mAppWidgetContainer = (KeyguardWidgetPager) findViewById(R.id.app_widget_container); mAppWidgetContainer = (KeyguardWidgetPager) findViewById(R.id.app_widget_container);
mAppWidgetContainer.setVisibility(VISIBLE); KeyguardWidgetRegion kgwr = (KeyguardWidgetRegion) findViewById(R.id.kg_widget_region);
kgwr.setVisibility(VISIBLE);
mSecurityViewContainer = (ViewFlipper) findViewById(R.id.view_flipper); mSecurityViewContainer = (ViewFlipper) findViewById(R.id.view_flipper);
// This code manages showing/hiding the transport control. We keep it around and only // This code manages showing/hiding the transport control. We keep it around and only

View File

@@ -26,15 +26,12 @@ import android.content.Intent;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.UserHandle; import android.os.UserHandle;
import android.provider.MediaStore; import android.provider.MediaStore;
import android.telephony.TelephonyManager;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.Log; import android.util.Log;
import android.util.Slog; import android.util.Slog;
import android.view.View; import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.IccCardConstants.State; import com.android.internal.telephony.IccCardConstants.State;
import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.multiwaveview.GlowPadView; import com.android.internal.widget.multiwaveview.GlowPadView;

View File

@@ -20,6 +20,7 @@ import android.appwidget.AppWidgetHostView;
import android.content.Context; import android.content.Context;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.Gravity; import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.animation.AccelerateInterpolator; import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator; import android.view.animation.DecelerateInterpolator;
@@ -63,6 +64,12 @@ public class KeyguardWidgetPager extends PagedView {
addView(frame); addView(frame);
} }
protected void onUnhandledTap(MotionEvent ev) {
if (getParent() instanceof KeyguardWidgetRegion) {
((KeyguardWidgetRegion) getParent()).showPagingFeedback();
}
}
/* /*
* This interpolator emulates the rate at which the perceived scale of an object changes * This interpolator emulates the rate at which the perceived scale of an object changes
* as its distance from a camera increases. When this interpolator is applied to a scale * as its distance from a camera increases. When this interpolator is applied to a scale

View File

@@ -0,0 +1,63 @@
/*
* Copyright (C) 2012 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.internal.policy.impl.keyguard;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import com.android.internal.R;
public class KeyguardWidgetRegion extends LinearLayout {
KeyguardGlowStripView mLeftStrip;
KeyguardGlowStripView mRightStrip;
KeyguardWidgetPager mPager;
public KeyguardWidgetRegion(Context context) {
this(context, null, 0);
}
public KeyguardWidgetRegion(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public KeyguardWidgetRegion(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mLeftStrip = (KeyguardGlowStripView) findViewById(R.id.left_strip);
mRightStrip = (KeyguardGlowStripView) findViewById(R.id.right_strip);
mPager = (KeyguardWidgetPager) findViewById(R.id.app_widget_container);
setSoundEffectsEnabled(false);
setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showPagingFeedback();
}
});
}
public void showPagingFeedback() {
mLeftStrip.makeEmGo();
mRightStrip.makeEmGo();
}
}