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

Commit 1d500220 authored by Jim Miller's avatar Jim Miller Committed by Android Git Automerger
Browse files

am af5a45a7: am 74bc9b68: Merge "Implement music and user priority scheme in...

am af5a45a7: am 74bc9b68: Merge "Implement music and user priority scheme in keyguard" into jb-mr1-dev

* commit 'af5a45a7':
  Implement music and user priority scheme in keyguard
parents 8f022057 af5a45a7
Loading
Loading
Loading
Loading
+104 −16
Original line number Diff line number Diff line
@@ -33,6 +33,8 @@ import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.os.Looper;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.UserManager;
import android.util.AttributeSet;
import android.util.Log;
@@ -43,12 +45,14 @@ import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.View.BaseSavedState;
import android.view.animation.AnimationUtils;
import android.widget.RemoteViews.OnClickHandler;
import android.widget.ViewFlipper;

import com.android.internal.R;
import com.android.internal.policy.impl.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.internal.policy.impl.keyguard.KeyguardTransportControlView.SavedState;
import com.android.internal.widget.LockPatternUtils;

import java.io.File;
@@ -64,6 +68,10 @@ public class KeyguardHostView extends KeyguardViewBase {
    static final int APPWIDGET_HOST_ID = 0x4B455947;
    private static final String KEYGUARD_WIDGET_PREFS = "keyguard_widget_prefs";

    private static final int TRANSPORT_GONE = 0;
    private static final int TRANSPORT_INVISIBLE = 1;
    private static final int TRANSPORT_VISIBLE = 2;

    private AppWidgetHost mAppWidgetHost;
    private KeyguardWidgetRegion mAppWidgetRegion;
    private KeyguardWidgetPager mAppWidgetContainer;
@@ -83,10 +91,12 @@ public class KeyguardHostView extends KeyguardViewBase {
    private KeyguardSecurityModel mSecurityModel;

    private Rect mTempRect = new Rect();
    private int mTransportState = TRANSPORT_GONE;

    /*package*/ interface TransportCallback {
        void hide();
        void show();
        void onListenerDetached();
        void onListenerAttached();
        void onPlayStateChanged();
    }

    /*package*/ interface UserSwitcherCallback {
@@ -185,7 +195,7 @@ public class KeyguardHostView extends KeyguardViewBase {
        mAppWidgetHost.startListening();
        maybePopulateWidgets();
        disableStatusViewInteraction();
        showAppropriateWidgetPage();
        post(mSwitchPageRunnable);
    }

    private void disableStatusViewInteraction() {
@@ -712,7 +722,7 @@ public class KeyguardHostView extends KeyguardViewBase {
    private void addDefaultWidgets() {
        LayoutInflater inflater = LayoutInflater.from(mContext);
        inflater.inflate(R.layout.keyguard_status_view, mAppWidgetContainer, true);
        inflater.inflate(R.layout.keyguard_transport_control_view, mAppWidgetContainer, true);
        inflater.inflate(R.layout.keyguard_transport_control_view, this, true);

        inflateAndAddUserSelectorWidgetIfNecessary();
        initializeTransportControl();
@@ -721,16 +731,16 @@ public class KeyguardHostView extends KeyguardViewBase {
    private void initializeTransportControl() {
        mTransportControl =
            (KeyguardTransportControlView) findViewById(R.id.keyguard_transport_control);
        mTransportControl.setVisibility(View.GONE);

        // This code manages showing/hiding the transport control. We keep it around and only
        // add it to the hierarchy if it needs to be present.
        if (mTransportControl != null) {
            mTransportControl.setKeyguardCallback(new TransportCallback() {
                boolean mSticky = false;
                @Override
                public void hide() {
                public void onListenerDetached() {
                    int page = getWidgetPosition(R.id.keyguard_transport_control);
                    if (page != -1 && !mSticky) {
                    if (page != -1) {
                        if (page == mAppWidgetContainer.getCurrentPage()) {
                            // Switch back to clock view if music was showing.
                            mAppWidgetContainer
@@ -741,20 +751,23 @@ public class KeyguardHostView extends KeyguardViewBase {
                        // from AudioManager
                        KeyguardHostView.this.addView(mTransportControl);
                        mTransportControl.setVisibility(View.GONE);
                        mTransportState = TRANSPORT_GONE;
                    }
                }

                @Override
                public void show() {
                public void onListenerAttached() {
                    if (getWidgetPosition(R.id.keyguard_transport_control) == -1) {
                        KeyguardHostView.this.removeView(mTransportControl);
                        mAppWidgetContainer.addView(mTransportControl,
                                getWidgetPosition(R.id.keyguard_status_view) + 1);
                        mAppWidgetContainer.addView(mTransportControl, 0);
                        mTransportControl.setVisibility(View.VISIBLE);
                        // Once shown, leave it showing
                        mSticky = true;
                    }
                }

                @Override
                public void onPlayStateChanged() {
                    mTransportControl.post(mSwitchPageRunnable);
                }
            });
        }
    }
@@ -796,12 +809,87 @@ public class KeyguardHostView extends KeyguardViewBase {
        }
    }

    Runnable mSwitchPageRunnable = new Runnable() {
        @Override
        public void run() {
           showAppropriateWidgetPage();
        }
    };

    static class SavedState extends BaseSavedState {
        int transportState;

        SavedState(Parcelable superState) {
            super(superState);
        }

        private SavedState(Parcel in) {
            super(in);
            this.transportState = in.readInt();
        }

        @Override
        public void writeToParcel(Parcel out, int flags) {
            super.writeToParcel(out, flags);
            out.writeInt(this.transportState);
        }

        public static final Parcelable.Creator<SavedState> CREATOR
                = new Parcelable.Creator<SavedState>() {
            public SavedState createFromParcel(Parcel in) {
                return new SavedState(in);
            }

            public SavedState[] newArray(int size) {
                return new SavedState[size];
            }
        };
    }

    @Override
    public Parcelable onSaveInstanceState() {
        Parcelable superState = super.onSaveInstanceState();
        SavedState ss = new SavedState(superState);
        ss.transportState = mTransportState;
        return ss;
    }

    @Override
    public void onRestoreInstanceState(Parcelable state) {
        if (!(state instanceof SavedState)) {
            super.onRestoreInstanceState(state);
            return;
        }
        SavedState ss = (SavedState) state;
        super.onRestoreInstanceState(ss.getSuperState());
        mTransportState = ss.transportState;
        post(mSwitchPageRunnable);
    }

    private void showAppropriateWidgetPage() {
        int page = mAppWidgetContainer.indexOfChild(findViewById(R.id.keyguard_status_view));
        if (mAppWidgetContainer.indexOfChild(mTransportControl) != -1) {
            page = mAppWidgetContainer.indexOfChild(mTransportControl);

        // The following sets the priority for showing widgets. Transport should be shown if
        // music is playing, followed by the multi-user widget if enabled, followed by the
        // status widget.
        final int pageToShow;
        if (mTransportControl.isMusicPlaying() || mTransportState == TRANSPORT_VISIBLE) {
            mTransportState = TRANSPORT_VISIBLE;
            pageToShow = mAppWidgetContainer.indexOfChild(mTransportControl);
        } else {
            UserManager mUm = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
            final View multiUserView = findViewById(R.id.keyguard_multi_user_selector);
            final int multiUserPosition = mAppWidgetContainer.indexOfChild(multiUserView);
            if (multiUserPosition != -1 && mUm.getUsers(true).size() > 1) {
                pageToShow = multiUserPosition;
            } else {
                final View statusView = findViewById(R.id.keyguard_status_view);
                pageToShow = mAppWidgetContainer.indexOfChild(statusView);
            }
            if (mTransportState == TRANSPORT_VISIBLE) {
                mTransportState = TRANSPORT_INVISIBLE;
            }
        }
        mAppWidgetContainer.setCurrentPage(page);
        mAppWidgetContainer.setCurrentPage(pageToShow);
    }

    private void inflateAndAddUserSelectorWidgetIfNecessary() {
+28 −31
Original line number Diff line number Diff line
@@ -42,7 +42,6 @@ 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;

@@ -59,7 +58,7 @@ public class KeyguardTransportControlView extends KeyguardWidgetFrame implements
    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 boolean DEBUG = true;
    protected static final String TAG = "TransportControlView";

    private ImageView mAlbumArt;
@@ -75,6 +74,7 @@ public class KeyguardTransportControlView extends KeyguardWidgetFrame implements
    private int mCurrentPlayState;
    private AudioManager mAudioManager;
    private IRemoteControlDisplayWeak mIRCD;
    private boolean mMusicClientPresent = true;

    /**
     * The metadata which should be populated into the view once we've been attached
@@ -112,7 +112,9 @@ public class KeyguardTransportControlView extends KeyguardWidgetFrame implements
            case MSG_SET_GENERATION_ID:
                if (msg.arg2 != 0) {
                    // This means nobody is currently registered. Hide the view.
                    hide();
                    onListenerDetached();
                } else {
                    onListenerAttached();
                }
                if (DEBUG) Log.v(TAG, "New genId = " + msg.arg1 + ", clearing = " + msg.arg2);
                mClientGeneration = msg.arg1;
@@ -193,26 +195,24 @@ public class KeyguardTransportControlView extends KeyguardWidgetFrame implements
        mIRCD = new IRemoteControlDisplayWeak(mHandler);
    }

    protected void hide() {
        if (DEBUG) Log.v(TAG, "Transport was told to hide");
    protected void onListenerDetached() {
        mMusicClientPresent = false;
        if (DEBUG) Log.v(TAG, "onListenerDetached()");
        if (mTransportCallback != null) {
            mTransportCallback.hide();
            mTransportCallback.onListenerDetached();
        } else {
            Log.w(TAG, "Hide music, but callback wasn't set");
            Log.w(TAG, "onListenerDetached: no callback");
        }
    }

    private void show() {
        if (DEBUG) Log.v(TAG, "Transport was told to show");
    private void onListenerAttached() {
        mMusicClientPresent = true;
        if (DEBUG) Log.v(TAG, "onListenerAttached()");
        if (mTransportCallback != null) {
            mTransportCallback.show();
            mTransportCallback.onListenerAttached();
        } else {
            Log.w(TAG, "Show music, but callback wasn't set");
        }
            Log.w(TAG, "onListenerAttached(): no callback");
        }

    private void userActivity() {
        // TODO Auto-generated method stub
    }

    private void updateTransportControls(int transportControlFlags) {
@@ -341,6 +341,11 @@ public class KeyguardTransportControlView extends KeyguardWidgetFrame implements
        updatePlayPauseState(mCurrentPlayState);
    }

    public boolean isMusicPlaying() {
       return mCurrentPlayState == RemoteControlClient.PLAYSTATE_PLAYING
               || mCurrentPlayState == RemoteControlClient.PLAYSTATE_BUFFERING;
    }

    private static void setVisibilityBasedOnFlag(View view, int flags, int flag) {
        if ((flags & flag) != 0) {
            view.setVisibility(View.VISIBLE);
@@ -357,7 +362,6 @@ public class KeyguardTransportControlView extends KeyguardWidgetFrame implements
        }
        final int imageResId;
        final int imageDescId;
        boolean showIfHidden = false;
        switch (state) {
            case RemoteControlClient.PLAYSTATE_ERROR:
                imageResId = com.android.internal.R.drawable.stat_sys_warning;
@@ -369,32 +373,27 @@ public class KeyguardTransportControlView extends KeyguardWidgetFrame implements
            case RemoteControlClient.PLAYSTATE_PLAYING:
                imageResId = com.android.internal.R.drawable.ic_media_pause;
                imageDescId = com.android.internal.R.string.lockscreen_transport_pause_description;
                showIfHidden = true;
                break;

            case RemoteControlClient.PLAYSTATE_BUFFERING:
                imageResId = com.android.internal.R.drawable.ic_media_stop;
                imageDescId = com.android.internal.R.string.lockscreen_transport_stop_description;
                showIfHidden = true;
                break;

            case RemoteControlClient.PLAYSTATE_PAUSED:
            default:
                imageResId = com.android.internal.R.drawable.ic_media_play;
                imageDescId = com.android.internal.R.string.lockscreen_transport_play_description;
                showIfHidden = false;
                break;
        }
        mBtnPlay.setImageResource(imageResId);
        mBtnPlay.setContentDescription(getResources().getString(imageDescId));
        if (showIfHidden) {
            show();
        }
        mCurrentPlayState = state;
        mTransportCallback.onPlayStateChanged();
    }

    static class SavedState extends BaseSavedState {
        boolean wasShowing;
        boolean clientPresent;

        SavedState(Parcelable superState) {
            super(superState);
@@ -402,13 +401,13 @@ public class KeyguardTransportControlView extends KeyguardWidgetFrame implements

        private SavedState(Parcel in) {
            super(in);
            this.wasShowing = in.readInt() != 0;
            this.clientPresent = in.readInt() != 0;
        }

        @Override
        public void writeToParcel(Parcel out, int flags) {
            super.writeToParcel(out, flags);
            out.writeInt(this.wasShowing ? 1 : 0);
            out.writeInt(this.clientPresent ? 1 : 0);
        }

        public static final Parcelable.Creator<SavedState> CREATOR
@@ -425,24 +424,23 @@ public class KeyguardTransportControlView extends KeyguardWidgetFrame implements

    @Override
    public Parcelable onSaveInstanceState() {
        if (DEBUG) Log.v(TAG, "onSaveInstanceState()");
        Parcelable superState = super.onSaveInstanceState();
        SavedState ss = new SavedState(superState);
        ss.wasShowing = getVisibility() == View.VISIBLE;
        ss.clientPresent = mMusicClientPresent;
        return ss;
    }

    @Override
    public void onRestoreInstanceState(Parcelable state) {
        if (DEBUG) Log.v(TAG, "onRestoreInstanceState()");
        if (!(state instanceof SavedState)) {
            super.onRestoreInstanceState(state);
            return;
        }
        SavedState ss = (SavedState) state;
        super.onRestoreInstanceState(ss.getSuperState());
        if (ss.wasShowing) {
            show();
        if (ss.clientPresent) {
            if (DEBUG) Log.v(TAG, "Reattaching client because it was attached");
            onListenerAttached();
        }
    }

@@ -458,7 +456,6 @@ public class KeyguardTransportControlView extends KeyguardWidgetFrame implements
        }
        if (keyCode != -1) {
            sendMediaButtonClick(keyCode);
            userActivity();
        }
    }

+7 −1
Original line number Diff line number Diff line
@@ -48,7 +48,7 @@ import com.android.internal.widget.LockPatternUtils;
 * reported to this class by the current {@link KeyguardViewBase}.
 */
public class KeyguardViewManager {
    private final static boolean DEBUG = false;
    private final static boolean DEBUG = true;
    private static String TAG = "KeyguardViewManager";
    public static boolean USE_UPPER_CASE = true;

@@ -359,6 +359,12 @@ public class KeyguardViewManager {

        if (mKeyguardHost != null) {
            mKeyguardHost.setVisibility(View.GONE);

            // We really only want to preserve keyguard state for configuration changes. Hence
            // we should clear state of widgets (e.g. Music) when we hide keyguard so it can
            // start with a fresh state when we return.
            mStateContainer.clear();

            // Don't do this right away, so we can let the view continue to animate
            // as it goes away.
            if (mKeyguardView != null) {