1af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock/*
2af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * Copyright (C) 2010 The Android Open Source Project
3af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock *
4af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * Licensed under the Apache License, Version 2.0 (the "License");
5af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * you may not use this file except in compliance with the License.
6af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * You may obtain a copy of the License at
7af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock *
8af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock *      http://www.apache.org/licenses/LICENSE-2.0
9af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock *
10af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * Unless required by applicable law or agreed to in writing, software
11af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * distributed under the License is distributed on an "AS IS" BASIS,
12af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * See the License for the specific language governing permissions and
14af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * limitations under the License.
15af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock */
16af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
17af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockpackage com.android.systemui.statusbar.policy;
18af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
19af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.content.Context;
20af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.os.UserHandle;
21af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
22af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.internal.view.RotationPolicy;
23af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
24af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport java.util.concurrent.CopyOnWriteArrayList;
25af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
26af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock/** Platform implementation of the rotation lock controller. **/
27af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockpublic final class RotationLockControllerImpl implements RotationLockController {
28af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private final Context mContext;
29af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private final CopyOnWriteArrayList<RotationLockControllerCallback> mCallbacks =
30af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            new CopyOnWriteArrayList<RotationLockControllerCallback>();
31af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
32af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private final RotationPolicy.RotationPolicyListener mRotationPolicyListener =
33af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            new RotationPolicy.RotationPolicyListener() {
34af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        @Override
35af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        public void onChange() {
36af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            notifyChanged();
37af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
38af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    };
39af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
40af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public RotationLockControllerImpl(Context context) {
41af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mContext = context;
42ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock        setListening(true);
43af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
44af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
45af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public void addRotationLockControllerCallback(RotationLockControllerCallback callback) {
46af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mCallbacks.add(callback);
47ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock        notifyChanged(callback);
48af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
49af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
50af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public void removeRotationLockControllerCallback(RotationLockControllerCallback callback) {
51af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mCallbacks.remove(callback);
52af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
53af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
54af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public int getRotationLockOrientation() {
55af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        return RotationPolicy.getRotationLockOrientation(mContext);
56af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
57af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
58af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public boolean isRotationLocked() {
59af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        return RotationPolicy.isRotationLocked(mContext);
60af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
61af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
62af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public void setRotationLocked(boolean locked) {
63af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        RotationPolicy.setRotationLock(mContext, locked);
64af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
65af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
66af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public boolean isRotationLockAffordanceVisible() {
67af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        return RotationPolicy.isRotationLockToggleVisible(mContext);
68af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
69af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
70af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    @Override
71ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock    public void setListening(boolean listening) {
72ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock        if (listening) {
73ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock            RotationPolicy.registerRotationPolicyListener(mContext, mRotationPolicyListener,
74ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock                    UserHandle.USER_ALL);
75ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock        } else {
76ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock            RotationPolicy.unregisterRotationPolicyListener(mContext, mRotationPolicyListener);
77ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock        }
78af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
79af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
80af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private void notifyChanged() {
81af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        for (RotationLockControllerCallback callback : mCallbacks) {
82ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock            notifyChanged(callback);
83af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
84af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
85ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock
86ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock    private void notifyChanged(RotationLockControllerCallback callback) {
87ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock        callback.onRotationLockStateChanged(RotationPolicy.isRotationLocked(mContext),
88ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock                RotationPolicy.isRotationLockToggleVisible(mContext));
89ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock    }
90af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock}
91