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

Commit 62368289 authored by Les Prock's avatar Les Prock Committed by Roman Birg
Browse files

Wallpaper Overscroll and Transparent NavBar

Now possible to offset wallpaper windows by more than the size of the wallpaper
and add added a transparent mode to the NavigationBar

Change-Id: I2b0f1129a4cf73b8def35abb7072d0472a9cc972
parent 2346ae66
Loading
Loading
Loading
Loading
+36 −2
Original line number Diff line number Diff line
@@ -67,6 +67,8 @@ public class WallpaperManager {
    private static boolean DEBUG = false;
    private float mWallpaperXStep = -1;
    private float mWallpaperYStep = -1;
    private int mWallpaperXOverscroll = -1;
    private int mWallpaperYOverscroll = -1;

    /**
     * Activity Action: Show settings for choosing wallpaper. Do not use directly to construct
@@ -950,14 +952,46 @@ public class WallpaperManager {
    public void setWallpaperOffsets(IBinder windowToken, float xOffset, float yOffset) {
        try {
            //Log.v(TAG, "Sending new wallpaper offsets from app...");
            WindowManagerGlobal.getWindowSession().setWallpaperPosition(
                    windowToken, xOffset, yOffset, mWallpaperXStep, mWallpaperYStep);
            WindowManagerGlobal.getWindowSession().setWallpaperPositionOverscroll(
                    windowToken, xOffset, yOffset, mWallpaperXStep, mWallpaperYStep,
                    -1, -1, mWallpaperXOverscroll, mWallpaperYOverscroll);
            //Log.v(TAG, "...app returning after sending offsets!");
        } catch (RemoteException e) {
            // Ignore.
        }
    }

    /**
     * Set the position of the current wallpaper within any larger space, when
     * that wallpaper is visible behind the given window.  The X and Y offsets
     * are floating point numbers ranging from 0 to 1, representing where the
     * wallpaper should be positioned within the range specified by setWallpaperOverscroll.
     *
     * @param windowToken The window who these offsets should be associated
     * with, as returned by {@link android.view.View#getWindowToken()
     * View.getWindowToken()}.
     * @param xOverscrollOffset The overscroll offset along the X dimension, from 0 to 1.
     * @param yOverscrollOffset The overscroll offset along the Y dimension, from 0 to 1.
     */
    public void setWallpaperOverscrollOffsets(IBinder windowToken, float xOverscrollOffset,
            float yOverscrollOffset) {
        try {
            //Log.v(TAG, "Sending new wallpaper offsets from app...");
            WindowManagerGlobal.getWindowSession().setWallpaperPositionOverscroll(
                    windowToken, -1, -1, mWallpaperXStep, mWallpaperYStep,
                    xOverscrollOffset, yOverscrollOffset, mWallpaperXOverscroll,
                    mWallpaperYOverscroll);
            //Log.v(TAG, "...app returning after sending offsets!");
        } catch (RemoteException e) {
            // Ignore.
        }
    }

    public void setWallpaperOverscroll(int xOverscroll, int yOverscroll) {
        mWallpaperXOverscroll = xOverscroll;
        mWallpaperYOverscroll = yOverscroll;
    }

    /**
     * For applications that use multiple virtual screens showing a wallpaper,
     * specify the step size between virtual screens. For example, if the
+10 −0
Original line number Diff line number Diff line
@@ -175,6 +175,16 @@ interface IWindowSession {
     */
    void setWallpaperPosition(IBinder windowToken, float x, float y, float xstep, float ystep);

    /**
     * For windows with the wallpaper behind them, and the wallpaper is
     * larger than the screen, set the offset within the screen.
     * For multi screen launcher type applications, xstep and ystep indicate
     * how big the increment is from one screen to another.
     */
    void setWallpaperPositionOverscroll(IBinder windowToken, float x, float y,
            float xstep, float ystep, float xoverscroll, float yoverscroll,
            int xoverscrollmax, int yoverscrollmax);
    
    void wallpaperOffsetsComplete(IBinder window);
    
    Bundle sendWallpaperCommand(IBinder window, String action, int x, int y,
+9 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ public class BarTransitions {
    public static final int MODE_SEMI_TRANSPARENT = 1;
    public static final int MODE_TRANSLUCENT = 2;
    public static final int MODE_LIGHTS_OUT = 3;
    public static final int MODE_TRANSPARENT = 4;

    public static final int LIGHTS_IN_DURATION = 250;
    public static final int LIGHTS_OUT_DURATION = 750;
@@ -92,6 +93,8 @@ public class BarTransitions {
        if (mode == MODE_SEMI_TRANSPARENT) return "MODE_SEMI_TRANSPARENT";
        if (mode == MODE_TRANSLUCENT) return "MODE_TRANSLUCENT";
        if (mode == MODE_LIGHTS_OUT) return "MODE_LIGHTS_OUT";
        if (mode == MODE_TRANSPARENT) return "MODE_TRANSPARENT";
        if (DEBUG && mode == -1) return "-1";
        throw new IllegalArgumentException("Unknown mode " + mode);
    }

@@ -103,6 +106,10 @@ public class BarTransitions {
        // for subclasses
    }

    public void applyTransparent(boolean sticky) {
        // for subclasses
    }

    private static class BarBackgroundDrawable extends Drawable {
        private final int mOpaque;
        private final int mSemiTransparent;
@@ -182,6 +189,8 @@ public class BarTransitions {
                targetGradientAlpha = 0xff;
            } else if (mMode == MODE_SEMI_TRANSPARENT) {
                targetColor = mSemiTransparent;
            } else if (mMode == MODE_TRANSPARENT) {
                targetGradientAlpha = 0;
            } else {
                targetColor = mOpaque;
            }
+14 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ public final class NavigationBarTransitions extends BarTransitions {
    private boolean mLightsOut;
    private boolean mVertical;
    private int mRequestedMode;
    private boolean mStickyTransparent;

    public NavigationBarTransitions(NavigationBarView view) {
        super(view, R.drawable.nav_background);
@@ -66,6 +67,8 @@ public final class NavigationBarTransitions extends BarTransitions {
        if (mVertical && mode == MODE_TRANSLUCENT) {
            // translucent mode not allowed when vertical
            mode = MODE_OPAQUE;
        } else if (mStickyTransparent) {
            mode = MODE_TRANSPARENT;
        }
        super.transitionTo(mode, animate);
    }
@@ -125,6 +128,17 @@ public final class NavigationBarTransitions extends BarTransitions {
        }
    }

    public void applyTransparent(boolean sticky) {
        if (sticky != mStickyTransparent) {
            mStickyTransparent = sticky;
            if (!mStickyTransparent) {
                transitionTo(mRequestedMode, false);
            } else {
                transitionTo(MODE_TRANSPARENT, false);
            }
        }
    }

    private static float maxVisibleQuiescentAlpha(float max, View v) {
        if ((v instanceof KeyButtonView) && v.isShown()) {
            return Math.max(max, ((KeyButtonView)v).getQuiescentAlpha());
+79 −1
Original line number Diff line number Diff line
@@ -25,18 +25,25 @@ import android.app.ActivityManagerNative;
import android.app.StatusBarManager;
import android.app.admin.DevicePolicyManager;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.RemoteException;
import android.os.UserHandle;
import android.provider.Settings;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Display;
@@ -110,6 +117,9 @@ public class NavigationBarView extends LinearLayout {
    // performs manual animation in sync with layout transitions
    private final NavTransitionListener mTransitionListener = new NavTransitionListener();

    private boolean mModLockDisabled = true;
    private SettingsObserver mObserver;

    private class NavTransitionListener implements TransitionListener {
        private boolean mBackTransitioning;
        private boolean mHomeAppearing;
@@ -238,6 +248,8 @@ public class NavigationBarView extends LinearLayout {
                new IntentFilter(NAVBAR_EDIT_ACTION), null, null);

        mLockUtils = new LockPatternUtils(context);

        mObserver = new SettingsObserver(new Handler());
    }

    private void watchForDevicePolicyChanges() {
@@ -477,8 +489,9 @@ public class NavigationBarView extends LinearLayout {
        final boolean showSearch = disableHome && !disableSearch;
        final boolean showCamera = showSearch && !mCameraDisabledByDpm
                && mLockUtils.getCameraEnabled();

        setVisibleOrGone(getSearchLight(), showSearch);
        setVisibleOrGone(getCameraButton(), showCamera);
        setVisibleOrGone(getCameraButton(), showCamera && mModLockDisabled);

        mBarTransitions.applyBackButtonQuiescentAlpha(mBarTransitions.getMode(), true /*animate*/);
    }
@@ -544,6 +557,24 @@ public class NavigationBarView extends LinearLayout {
        watchForAccessibilityChanges();
    }

    @Override
    public void onAttachedToWindow() {
        super.onAttachedToWindow();

        final Bundle keyguard_metadata = NavigationBarView
                    .getApplicationMetadata(mContext, "com.android.keyguard");
                if (null != keyguard_metadata &&
                    keyguard_metadata.getBoolean("com.cyanogenmod.keyguard", false)) {
                        mObserver.observe();
                }
    }

    @Override
    public void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        mObserver.unobserve();
    }

    private void watchForAccessibilityChanges() {
        final AccessibilityManager am =
                (AccessibilityManager) mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
@@ -767,4 +798,51 @@ public class NavigationBarView extends LinearLayout {
        }
        pw.println();
    }

    private static Bundle getApplicationMetadata(Context context, String pkg) {
        if (pkg != null) {
            try {
                ApplicationInfo ai = context.getPackageManager().
                    getApplicationInfo(pkg, PackageManager.GET_META_DATA);
                return ai.metaData;
            } catch (NameNotFoundException e) {
                return null;
            }
        }

        return null;
    }

    private class SettingsObserver extends ContentObserver {
        private boolean mObserving = false;

        SettingsObserver(Handler handler) {
            super(handler);
        }

        void observe() {
            mObserving = true;
            ContentResolver resolver = mContext.getContentResolver();
            resolver.registerContentObserver(
                Settings.System.getUriFor(Settings.System.LOCKSCREEN_MODLOCK_ENABLED),
                false, this);

            // intialize mModlockDisabled
            onChange(false);
        }

        void unobserve() {
            if (mObserving) {
                mContext.getContentResolver().unregisterContentObserver(this);
                mObserving = false;
            }
        }

        @Override
        public void onChange(boolean selfChange) {
            mModLockDisabled = Settings.System.getInt(mContext.getContentResolver(),
                    Settings.System.LOCKSCREEN_MODLOCK_ENABLED, 1) == 0;
            setDisabledFlags(mDisabledFlags, true /* force */);
        }
    }
}
Loading