summaryrefslogtreecommitdiffstats
path: root/packages/SystemUI/src/com/android/systemui/statusbar/phone/ViewLinker.java
blob: 48457c6b24f62f6d493e1ec8220f1cbd3af7cccd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package com.android.systemui.statusbar.phone;

import android.view.View;

/*
    Allows mirroring of view states such as alpha, translation...etc
 */
public class ViewLinker<T extends View & ViewLinker.ViewLinkerParent> {

    public static final int LINK_ALPHA = 0x1;
    public static final int LINK_TRANSLATION = 0x2;

    private final LinkInfo[] mLinkedViews;
    private final T mParent;

    public interface ViewLinkerCallback {
        void onAlphaChanged(float alpha);
        void onTranslationXChanged(float translationX);
    }

    public interface ViewLinkerParent {
        void registerLinker(ViewLinkerCallback callback);
    }

    public static class LinkInfo {
        private View mView;
        private int mFlags;
        public LinkInfo(View v, int linkFlags) {
            mView = v;
            mFlags = linkFlags;
        }
        private boolean supportsFlag(int flag) {
            return (mFlags & flag) != 0;
        }
    }

    private ViewLinkerCallback mCallback = new ViewLinkerCallback() {
        @Override
        public void onAlphaChanged(float alpha) {
            for (LinkInfo v : mLinkedViews) {
                if (v.supportsFlag(LINK_ALPHA)) {
                    v.mView.setAlpha(alpha);
                }
            }
        }

        @Override
        public void onTranslationXChanged(float translationX) {
            for (LinkInfo v : mLinkedViews) {
                if (v.supportsFlag(LINK_TRANSLATION)) {
                    v.mView.setTranslationX(translationX);
                }
            }
        }
    };

    public ViewLinker(T parent, LinkInfo... viewsToLink) {
        mLinkedViews = viewsToLink;
        mParent = parent;
        ensureParentNotInLink();
        parent.registerLinker(mCallback);
    }

    private void ensureParentNotInLink() {
        for (LinkInfo v : mLinkedViews) {
            if (v.mView == mParent) {
                throw new IllegalStateException("Parent cannot be" +
                        "one of the linked views");
            }
        }
    }

    public View getParent() {
        return mParent;
    }
}