Implement correct music widget positioning in keyguard

This always inserts the music widget to the left of the camera
widget if it exists or as the right-most widget when music is
playing.

Fixes bug 7425361

Change-Id: Ida992fbdde254a2de0ab12c63e003ccfeab7a94a
This commit is contained in:
Jim Miller
2012-10-29 19:11:50 -07:00
parent 6249804ead
commit bdca3c0a21
3 changed files with 82 additions and 29 deletions

View File

@@ -48,7 +48,6 @@ import android.view.View;
import android.view.WindowManager;
import android.view.animation.AnimationUtils;
import android.widget.RemoteViews.OnClickHandler;
import android.widget.TextView;
import com.android.internal.R;
import com.android.internal.policy.impl.keyguard.KeyguardSecurityModel.SecurityMode;
@@ -144,7 +143,7 @@ public class KeyguardHostView extends KeyguardViewBase {
private int getWidgetPosition(int id) {
final int children = mAppWidgetContainer.getChildCount();
for (int i = 0; i < children; i++) {
if (mAppWidgetContainer.getChildAt(i).getId() == id) {
if (mAppWidgetContainer.getWidgetPageAt(i).getContent().getId() == id) {
return i;
}
}
@@ -864,7 +863,8 @@ public class KeyguardHostView extends KeyguardViewBase {
@Override
LockPatternUtils getLockPatternUtils() {
return mLockPatternUtils;
}};
}
};
private void addDefaultWidgets() {
LayoutInflater inflater = LayoutInflater.from(mContext);
@@ -906,6 +906,33 @@ public class KeyguardHostView extends KeyguardViewBase {
initializeTransportControl();
}
private void removeTransportFromWidgetPager() {
int page = getWidgetPosition(R.id.keyguard_transport_control);
if (page != -1) {
mAppWidgetContainer.removeWidget(mTransportControl);
// XXX keep view attached so we still get show/hide events from AudioManager
KeyguardHostView.this.addView(mTransportControl);
mTransportControl.setVisibility(View.GONE);
mTransportState = TRANSPORT_GONE;
mTransportControl.post(mSwitchPageRunnable);
}
}
private void addTransportToWidgetPager() {
if (getWidgetPosition(R.id.keyguard_transport_control) == -1) {
KeyguardHostView.this.removeView(mTransportControl);
// insert to left of camera if it exists, otherwise after right-most widget
int lastWidget = mAppWidgetContainer.getChildCount() - 1;
int position = 0; // handle no widget case
if (lastWidget >= 0) {
position = isCameraPage(lastWidget) ? lastWidget : lastWidget + 1;
}
mAppWidgetContainer.addWidget(mTransportControl, position);
mTransportControl.setVisibility(View.VISIBLE);
}
}
private void initializeTransportControl() {
mTransportControl =
(KeyguardTransportControlView) findViewById(R.id.keyguard_transport_control);
@@ -917,24 +944,14 @@ public class KeyguardHostView extends KeyguardViewBase {
mTransportControl.setKeyguardCallback(new TransportCallback() {
@Override
public void onListenerDetached() {
int page = getWidgetPosition(R.id.keyguard_transport_control);
if (page != -1) {
mAppWidgetContainer.removeView(mTransportControl);
// XXX keep view attached so we still get show/hide events from AudioManager
KeyguardHostView.this.addView(mTransportControl);
mTransportControl.setVisibility(View.GONE);
mTransportState = TRANSPORT_GONE;
mTransportControl.post(mSwitchPageRunnable);
}
removeTransportFromWidgetPager();
mTransportControl.post(mSwitchPageRunnable);
}
@Override
public void onListenerAttached() {
if (getWidgetPosition(R.id.keyguard_transport_control) == -1) {
KeyguardHostView.this.removeView(mTransportControl);
mAppWidgetContainer.addView(mTransportControl, 0);
mTransportControl.setVisibility(View.VISIBLE);
}
// Transport will be added when playstate changes...
mTransportControl.post(mSwitchPageRunnable);
}
@Override
@@ -1058,6 +1075,7 @@ public class KeyguardHostView extends KeyguardViewBase {
mTransportControl.isMusicPlaying() || mTransportState == TRANSPORT_VISIBLE;
if (isMusicPlaying) {
mTransportState = TRANSPORT_VISIBLE;
addTransportToWidgetPager();
} else if (mTransportState == TRANSPORT_VISIBLE) {
mTransportState = TRANSPORT_INVISIBLE;
}
@@ -1081,7 +1099,7 @@ public class KeyguardHostView extends KeyguardViewBase {
// if music playing, show transport
if (isMusicPlaying) {
if (DEBUG) Log.d(TAG, "Music playing, show transport");
return mAppWidgetContainer.indexOfChild(mTransportControl);
return mAppWidgetContainer.getWidgetPageIndex(mTransportControl);
}
// if we have a valid sticky widget, show it

View File

@@ -40,6 +40,7 @@ import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
@@ -49,14 +50,13 @@ import java.lang.ref.WeakReference;
/**
* This is the widget responsible for showing music controls in keyguard.
*/
public class KeyguardTransportControlView extends KeyguardWidgetFrame implements OnClickListener {
public class KeyguardTransportControlView extends FrameLayout implements OnClickListener {
private static final int MSG_UPDATE_STATE = 100;
private static final int MSG_SET_METADATA = 101;
private static final int MSG_SET_TRANSPORT_CONTROLS = 102;
private static final int MSG_SET_ARTWORK = 103;
private static final int MSG_SET_GENERATION_ID = 104;
private static final int MAXDIM = 512;
private static final int DISPLAY_TIMEOUT_MS = 5000; // 5s
protected static final boolean DEBUG = false;
protected static final String TAG = "TransportControlView";
@@ -260,14 +260,6 @@ public class KeyguardTransportControlView extends KeyguardWidgetFrame implements
mAttached = false;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// int dim = Math.min(MAXDIM, Math.max(getWidth(), getHeight()));
// Log.v(TAG, "setting max bitmap size: " + dim + "x" + dim);
// mAudioManager.remoteControlDisplayUsesBitmapSize(mIRCD, dim, dim);
}
class Metadata {
private String artist;
private String trackTitle;

View File

@@ -25,6 +25,7 @@ import android.appwidget.AppWidgetHostView;
import android.content.Context;
import android.content.res.Resources;
import android.util.AttributeSet;
import android.util.Slog;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
@@ -61,6 +62,7 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
private boolean mShowHintsOnLayout = false;
private static final long CUSTOM_WIDGET_USER_ACTIVITY_TIMEOUT = 30000;
private static final String TAG = "KeyguardWidgetPager";
private int mPage = 0;
private Callbacks mCallbacks;
@@ -226,25 +228,40 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
}
}
// We enforce that all children are KeyguardWidgetFrames
/**
* Use addWidget() instead.
* @deprecated
*/
@Override
public void addView(View child, int index) {
enforceKeyguardWidgetFrame(child);
super.addView(child, index);
}
/**
* Use addWidget() instead.
* @deprecated
*/
@Override
public void addView(View child, int width, int height) {
enforceKeyguardWidgetFrame(child);
super.addView(child, width, height);
}
/**
* Use addWidget() instead.
* @deprecated
*/
@Override
public void addView(View child, LayoutParams params) {
enforceKeyguardWidgetFrame(child);
super.addView(child, params);
}
/**
* Use addWidget() instead.
* @deprecated
*/
@Override
public void addView(View child, int index, LayoutParams params) {
enforceKeyguardWidgetFrame(child);
@@ -596,4 +613,30 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
}
return false;
}
public void removeWidget(View view) {
if (view instanceof KeyguardWidgetFrame) {
removeView(view);
} else {
// Assume view was wrapped by a KeyguardWidgetFrame in KeyguardWidgetPager#addWidget().
// This supports legacy hard-coded "widgets" like KeyguardTransportControlView.
int pos = getWidgetPageIndex(view);
if (pos != -1) {
KeyguardWidgetFrame frame = (KeyguardWidgetFrame) getChildAt(pos);
frame.removeView(view);
removeView(frame);
} else {
Slog.w(TAG, "removeWidget() can't find:" + view);
}
}
}
public int getWidgetPageIndex(View view) {
if (view instanceof KeyguardWidgetFrame) {
return indexOfChild(view);
} else {
// View was wrapped by a KeyguardWidgetFrame by KeyguardWidgetPager#addWidget()
return indexOfChild((KeyguardWidgetFrame)view.getParent());
}
}
}