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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user