Skip to content

Commit bdca3c0

Browse files
author
Jim Miller
committed
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
1 parent 6249804 commit bdca3c0

File tree

3 files changed

+82
-29
lines changed

3 files changed

+82
-29
lines changed

policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
import android.view.WindowManager;
4949
import android.view.animation.AnimationUtils;
5050
import android.widget.RemoteViews.OnClickHandler;
51-
import android.widget.TextView;
5251

5352
import com.android.internal.R;
5453
import com.android.internal.policy.impl.keyguard.KeyguardSecurityModel.SecurityMode;
@@ -144,7 +143,7 @@ protected void dispatchDraw(Canvas canvas) {
144143
private int getWidgetPosition(int id) {
145144
final int children = mAppWidgetContainer.getChildCount();
146145
for (int i = 0; i < children; i++) {
147-
if (mAppWidgetContainer.getChildAt(i).getId() == id) {
146+
if (mAppWidgetContainer.getWidgetPageAt(i).getContent().getId() == id) {
148147
return i;
149148
}
150149
}
@@ -864,7 +863,8 @@ KeyguardSecurityCallback getCallback() {
864863
@Override
865864
LockPatternUtils getLockPatternUtils() {
866865
return mLockPatternUtils;
867-
}};
866+
}
867+
};
868868

869869
private void addDefaultWidgets() {
870870
LayoutInflater inflater = LayoutInflater.from(mContext);
@@ -906,6 +906,33 @@ public void run() {
906906
initializeTransportControl();
907907
}
908908

909+
private void removeTransportFromWidgetPager() {
910+
int page = getWidgetPosition(R.id.keyguard_transport_control);
911+
if (page != -1) {
912+
mAppWidgetContainer.removeWidget(mTransportControl);
913+
914+
// XXX keep view attached so we still get show/hide events from AudioManager
915+
KeyguardHostView.this.addView(mTransportControl);
916+
mTransportControl.setVisibility(View.GONE);
917+
mTransportState = TRANSPORT_GONE;
918+
mTransportControl.post(mSwitchPageRunnable);
919+
}
920+
}
921+
922+
private void addTransportToWidgetPager() {
923+
if (getWidgetPosition(R.id.keyguard_transport_control) == -1) {
924+
KeyguardHostView.this.removeView(mTransportControl);
925+
// insert to left of camera if it exists, otherwise after right-most widget
926+
int lastWidget = mAppWidgetContainer.getChildCount() - 1;
927+
int position = 0; // handle no widget case
928+
if (lastWidget >= 0) {
929+
position = isCameraPage(lastWidget) ? lastWidget : lastWidget + 1;
930+
}
931+
mAppWidgetContainer.addWidget(mTransportControl, position);
932+
mTransportControl.setVisibility(View.VISIBLE);
933+
}
934+
}
935+
909936
private void initializeTransportControl() {
910937
mTransportControl =
911938
(KeyguardTransportControlView) findViewById(R.id.keyguard_transport_control);
@@ -917,24 +944,14 @@ private void initializeTransportControl() {
917944
mTransportControl.setKeyguardCallback(new TransportCallback() {
918945
@Override
919946
public void onListenerDetached() {
920-
int page = getWidgetPosition(R.id.keyguard_transport_control);
921-
if (page != -1) {
922-
mAppWidgetContainer.removeView(mTransportControl);
923-
// XXX keep view attached so we still get show/hide events from AudioManager
924-
KeyguardHostView.this.addView(mTransportControl);
925-
mTransportControl.setVisibility(View.GONE);
926-
mTransportState = TRANSPORT_GONE;
927-
mTransportControl.post(mSwitchPageRunnable);
928-
}
947+
removeTransportFromWidgetPager();
948+
mTransportControl.post(mSwitchPageRunnable);
929949
}
930950

931951
@Override
932952
public void onListenerAttached() {
933-
if (getWidgetPosition(R.id.keyguard_transport_control) == -1) {
934-
KeyguardHostView.this.removeView(mTransportControl);
935-
mAppWidgetContainer.addView(mTransportControl, 0);
936-
mTransportControl.setVisibility(View.VISIBLE);
937-
}
953+
// Transport will be added when playstate changes...
954+
mTransportControl.post(mSwitchPageRunnable);
938955
}
939956

940957
@Override
@@ -1058,6 +1075,7 @@ private void showAppropriateWidgetPage() {
10581075
mTransportControl.isMusicPlaying() || mTransportState == TRANSPORT_VISIBLE;
10591076
if (isMusicPlaying) {
10601077
mTransportState = TRANSPORT_VISIBLE;
1078+
addTransportToWidgetPager();
10611079
} else if (mTransportState == TRANSPORT_VISIBLE) {
10621080
mTransportState = TRANSPORT_INVISIBLE;
10631081
}
@@ -1081,7 +1099,7 @@ private int getAppropriateWidgetPage(boolean isMusicPlaying) {
10811099
// if music playing, show transport
10821100
if (isMusicPlaying) {
10831101
if (DEBUG) Log.d(TAG, "Music playing, show transport");
1084-
return mAppWidgetContainer.indexOfChild(mTransportControl);
1102+
return mAppWidgetContainer.getWidgetPageIndex(mTransportControl);
10851103
}
10861104

10871105
// if we have a valid sticky widget, show it

policy/src/com/android/internal/policy/impl/keyguard/KeyguardTransportControlView.java

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import android.view.KeyEvent;
4141
import android.view.View;
4242
import android.view.View.OnClickListener;
43+
import android.widget.FrameLayout;
4344
import android.widget.ImageView;
4445
import android.widget.TextView;
4546

@@ -49,14 +50,13 @@
4950
/**
5051
* This is the widget responsible for showing music controls in keyguard.
5152
*/
52-
public class KeyguardTransportControlView extends KeyguardWidgetFrame implements OnClickListener {
53+
public class KeyguardTransportControlView extends FrameLayout implements OnClickListener {
5354

5455
private static final int MSG_UPDATE_STATE = 100;
5556
private static final int MSG_SET_METADATA = 101;
5657
private static final int MSG_SET_TRANSPORT_CONTROLS = 102;
5758
private static final int MSG_SET_ARTWORK = 103;
5859
private static final int MSG_SET_GENERATION_ID = 104;
59-
private static final int MAXDIM = 512;
6060
private static final int DISPLAY_TIMEOUT_MS = 5000; // 5s
6161
protected static final boolean DEBUG = false;
6262
protected static final String TAG = "TransportControlView";
@@ -260,14 +260,6 @@ public void onDetachedFromWindow() {
260260
mAttached = false;
261261
}
262262

263-
@Override
264-
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
265-
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
266-
// int dim = Math.min(MAXDIM, Math.max(getWidth(), getHeight()));
267-
// Log.v(TAG, "setting max bitmap size: " + dim + "x" + dim);
268-
// mAudioManager.remoteControlDisplayUsesBitmapSize(mIRCD, dim, dim);
269-
}
270-
271263
class Metadata {
272264
private String artist;
273265
private String trackTitle;

policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetPager.java

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import android.content.Context;
2626
import android.content.res.Resources;
2727
import android.util.AttributeSet;
28+
import android.util.Slog;
2829
import android.view.Gravity;
2930
import android.view.MotionEvent;
3031
import android.view.View;
@@ -61,6 +62,7 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
6162
private boolean mShowHintsOnLayout = false;
6263

6364
private static final long CUSTOM_WIDGET_USER_ACTIVITY_TIMEOUT = 30000;
65+
private static final String TAG = "KeyguardWidgetPager";
6466

6567
private int mPage = 0;
6668
private Callbacks mCallbacks;
@@ -226,25 +228,40 @@ public void addWidget(View widget, int pageIndex) {
226228
}
227229
}
228230

229-
// We enforce that all children are KeyguardWidgetFrames
231+
/**
232+
* Use addWidget() instead.
233+
* @deprecated
234+
*/
230235
@Override
231236
public void addView(View child, int index) {
232237
enforceKeyguardWidgetFrame(child);
233238
super.addView(child, index);
234239
}
235240

241+
/**
242+
* Use addWidget() instead.
243+
* @deprecated
244+
*/
236245
@Override
237246
public void addView(View child, int width, int height) {
238247
enforceKeyguardWidgetFrame(child);
239248
super.addView(child, width, height);
240249
}
241250

251+
/**
252+
* Use addWidget() instead.
253+
* @deprecated
254+
*/
242255
@Override
243256
public void addView(View child, LayoutParams params) {
244257
enforceKeyguardWidgetFrame(child);
245258
super.addView(child, params);
246259
}
247260

261+
/**
262+
* Use addWidget() instead.
263+
* @deprecated
264+
*/
248265
@Override
249266
public void addView(View child, int index, LayoutParams params) {
250267
enforceKeyguardWidgetFrame(child);
@@ -596,4 +613,30 @@ public boolean onLongClick(View v) {
596613
}
597614
return false;
598615
}
616+
617+
public void removeWidget(View view) {
618+
if (view instanceof KeyguardWidgetFrame) {
619+
removeView(view);
620+
} else {
621+
// Assume view was wrapped by a KeyguardWidgetFrame in KeyguardWidgetPager#addWidget().
622+
// This supports legacy hard-coded "widgets" like KeyguardTransportControlView.
623+
int pos = getWidgetPageIndex(view);
624+
if (pos != -1) {
625+
KeyguardWidgetFrame frame = (KeyguardWidgetFrame) getChildAt(pos);
626+
frame.removeView(view);
627+
removeView(frame);
628+
} else {
629+
Slog.w(TAG, "removeWidget() can't find:" + view);
630+
}
631+
}
632+
}
633+
634+
public int getWidgetPageIndex(View view) {
635+
if (view instanceof KeyguardWidgetFrame) {
636+
return indexOfChild(view);
637+
} else {
638+
// View was wrapped by a KeyguardWidgetFrame by KeyguardWidgetPager#addWidget()
639+
return indexOfChild((KeyguardWidgetFrame)view.getParent());
640+
}
641+
}
599642
}

0 commit comments

Comments
 (0)