2 * Copyright (C) 2017 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5 * except in compliance with the License. You may obtain a copy of the License at
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software distributed under the
10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11 * KIND, either express or implied. See the License for the specific language governing
12 * permissions and limitations under the License.
15 package com.android.systemui;
17 import static com.android.systemui.tuner.TunablePadding.FLAG_START;
18 import static com.android.systemui.tuner.TunablePadding.FLAG_END;
20 import android.app.Fragment;
21 import android.graphics.PixelFormat;
22 import android.support.annotation.VisibleForTesting;
23 import android.util.DisplayMetrics;
24 import android.view.Gravity;
25 import android.view.LayoutInflater;
26 import android.view.View;
27 import android.view.ViewGroup;
28 import android.view.ViewGroup.LayoutParams;
29 import android.view.WindowManager;
31 import com.android.systemui.R.id;
32 import com.android.systemui.fragments.FragmentHostManager;
33 import com.android.systemui.fragments.FragmentHostManager.FragmentListener;
34 import com.android.systemui.plugins.qs.QS;
35 import com.android.systemui.statusbar.phone.CollapsedStatusBarFragment;
36 import com.android.systemui.statusbar.phone.NavigationBarFragment;
37 import com.android.systemui.statusbar.phone.StatusBar;
38 import com.android.systemui.tuner.TunablePadding;
39 import com.android.systemui.tuner.TunerService;
40 import com.android.systemui.tuner.TunerService.Tunable;
42 public class RoundedCorners extends SystemUI implements Tunable {
43 public static final String SIZE = "sysui_rounded_size";
44 public static final String PADDING = "sysui_rounded_content_padding";
46 private int mRoundedDefault;
47 private View mOverlay;
48 private View mBottomOverlay;
49 private float mDensity;
50 private TunablePadding mQsPadding;
51 private TunablePadding mStatusBarPadding;
52 private TunablePadding mNavBarPadding;
56 mRoundedDefault = mContext.getResources().getDimensionPixelSize(
57 R.dimen.rounded_corner_radius);
58 if (mRoundedDefault != 0) {
61 int padding = mContext.getResources().getDimensionPixelSize(
62 R.dimen.rounded_corner_content_padding);
64 setupPadding(padding);
68 private void setupRounding() {
69 mOverlay = LayoutInflater.from(mContext)
70 .inflate(R.layout.rounded_corners, null);
71 mOverlay.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
72 mOverlay.findViewById(R.id.right).setRotation(90);
74 mContext.getSystemService(WindowManager.class)
75 .addView(mOverlay, getWindowLayoutParams());
76 mBottomOverlay = LayoutInflater.from(mContext)
77 .inflate(R.layout.rounded_corners, null);
78 mBottomOverlay.findViewById(R.id.right).setRotation(180);
79 mBottomOverlay.findViewById(R.id.left).setRotation(270);
80 WindowManager.LayoutParams layoutParams = getWindowLayoutParams();
81 layoutParams.gravity = Gravity.BOTTOM;
82 mContext.getSystemService(WindowManager.class)
83 .addView(mBottomOverlay, layoutParams);
85 DisplayMetrics metrics = new DisplayMetrics();
86 mContext.getSystemService(WindowManager.class)
87 .getDefaultDisplay().getMetrics(metrics);
88 mDensity = metrics.density;
90 Dependency.get(TunerService.class).addTunable(this, SIZE);
93 private void setupPadding(int padding) {
94 // Add some padding to all the content near the edge of the screen.
95 StatusBar sb = getComponent(StatusBar.class);
96 View statusBar = sb.getStatusBarWindow();
98 TunablePadding.addTunablePadding(statusBar.findViewById(R.id.keyguard_header), PADDING,
101 View navigationBarWindow = sb.getNavigationBarWindow();
102 // Not all devices have on screen navigation bars.
103 if (navigationBarWindow != null) {
104 FragmentHostManager.get(navigationBarWindow).addTagListener(
105 NavigationBarFragment.TAG,
106 new TunablePaddingTagListener(padding, 0));
109 FragmentHostManager fragmentHostManager = FragmentHostManager.get(statusBar);
110 fragmentHostManager.addTagListener(CollapsedStatusBarFragment.TAG,
111 new TunablePaddingTagListener(padding, R.id.status_bar));
112 fragmentHostManager.addTagListener(QS.TAG,
113 new TunablePaddingTagListener(padding, R.id.header));
116 private WindowManager.LayoutParams getWindowLayoutParams() {
117 final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
118 ViewGroup.LayoutParams.MATCH_PARENT,
119 LayoutParams.WRAP_CONTENT,
120 WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
121 WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
122 | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
123 | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
124 | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
125 | WindowManager.LayoutParams.FLAG_SLIPPERY
126 | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
127 PixelFormat.TRANSLUCENT);
128 lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS
129 | WindowManager.LayoutParams.PRIVATE_FLAG_NO_MAGNIFICATION_REGION_EFFECT;
130 lp.setTitle("RoundedOverlay");
131 lp.gravity = Gravity.TOP;
137 public void onTuningChanged(String key, String newValue) {
138 if (mOverlay == null) return;
139 if (SIZE.equals(key)) {
140 int size = mRoundedDefault;
142 size = (int) (Integer.parseInt(newValue) * mDensity);
143 } catch (Exception e) {
145 setSize(mOverlay.findViewById(R.id.left), size);
146 setSize(mOverlay.findViewById(R.id.right), size);
147 setSize(mBottomOverlay.findViewById(R.id.left), size);
148 setSize(mBottomOverlay.findViewById(R.id.right), size);
152 private void setSize(View view, int pixelSize) {
153 LayoutParams params = view.getLayoutParams();
154 params.width = pixelSize;
155 params.height = pixelSize;
156 view.setLayoutParams(params);
160 static class TunablePaddingTagListener implements FragmentListener {
162 private final int mPadding;
163 private final int mId;
164 private TunablePadding mTunablePadding;
166 public TunablePaddingTagListener(int padding, int id) {
172 public void onFragmentViewCreated(String tag, Fragment fragment) {
173 if (mTunablePadding != null) {
174 mTunablePadding.destroy();
176 View view = fragment.getView();
178 view = view.findViewById(mId);
180 mTunablePadding = TunablePadding.addTunablePadding(view, PADDING, mPadding,
181 FLAG_START | FLAG_END);