Skip to content

Commit bd0bf15

Browse files
Jim MillerAndroid (Google) Code Review
authored andcommitted
Merge "Implement correct music widget positioning in keyguard" into jb-mr1-lockscreen-dev
2 parents a56395d + bdca3c0 commit bd0bf15

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
@@ -27,6 +27,7 @@
2727
import android.os.Handler;
2828
import android.os.HandlerThread;
2929
import android.util.AttributeSet;
30+
import android.util.Slog;
3031
import android.view.Gravity;
3132
import android.view.MotionEvent;
3233
import android.view.View;
@@ -62,6 +63,7 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
6263
private boolean mShowHintsOnLayout = false;
6364

6465
private static final long CUSTOM_WIDGET_USER_ACTIVITY_TIMEOUT = 30000;
66+
private static final String TAG = "KeyguardWidgetPager";
6567

6668
private int mPage = 0;
6769
private Callbacks mCallbacks;
@@ -245,25 +247,40 @@ public void addWidget(View widget, int pageIndex) {
245247
}
246248
}
247249

248-
// We enforce that all children are KeyguardWidgetFrames
250+
/**
251+
* Use addWidget() instead.
252+
* @deprecated
253+
*/
249254
@Override
250255
public void addView(View child, int index) {
251256
enforceKeyguardWidgetFrame(child);
252257
super.addView(child, index);
253258
}
254259

260+
/**
261+
* Use addWidget() instead.
262+
* @deprecated
263+
*/
255264
@Override
256265
public void addView(View child, int width, int height) {
257266
enforceKeyguardWidgetFrame(child);
258267
super.addView(child, width, height);
259268
}
260269

270+
/**
271+
* Use addWidget() instead.
272+
* @deprecated
273+
*/
261274
@Override
262275
public void addView(View child, LayoutParams params) {
263276
enforceKeyguardWidgetFrame(child);
264277
super.addView(child, params);
265278
}
266279

280+
/**
281+
* Use addWidget() instead.
282+
* @deprecated
283+
*/
267284
@Override
268285
public void addView(View child, int index, LayoutParams params) {
269286
enforceKeyguardWidgetFrame(child);
@@ -615,4 +632,30 @@ public boolean onLongClick(View v) {
615632
}
616633
return false;
617634
}
635+
636+
public void removeWidget(View view) {
637+
if (view instanceof KeyguardWidgetFrame) {
638+
removeView(view);
639+
} else {
640+
// Assume view was wrapped by a KeyguardWidgetFrame in KeyguardWidgetPager#addWidget().
641+
// This supports legacy hard-coded "widgets" like KeyguardTransportControlView.
642+
int pos = getWidgetPageIndex(view);
643+
if (pos != -1) {
644+
KeyguardWidgetFrame frame = (KeyguardWidgetFrame) getChildAt(pos);
645+
frame.removeView(view);
646+
removeView(frame);
647+
} else {
648+
Slog.w(TAG, "removeWidget() can't find:" + view);
649+
}
650+
}
651+
}
652+
653+
public int getWidgetPageIndex(View view) {
654+
if (view instanceof KeyguardWidgetFrame) {
655+
return indexOfChild(view);
656+
} else {
657+
// View was wrapped by a KeyguardWidgetFrame by KeyguardWidgetPager#addWidget()
658+
return indexOfChild((KeyguardWidgetFrame)view.getParent());
659+
}
660+
}
618661
}

0 commit comments

Comments
 (0)