Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bdca3c0a authored by Jim Miller's avatar Jim Miller
Browse files

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
parent 6249804e
Loading
Loading
Loading
Loading
+36 −18
Original line number Diff line number Diff line
@@ -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;
                    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
+2 −10
Original line number Diff line number Diff line
@@ -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;
+44 −1
Original line number Diff line number Diff line
@@ -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());
        }
    }
}