1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.test.silkfx.materials
17 
18 import android.app.Activity
19 import android.content.Intent
20 import android.content.Context
21 import android.graphics.Bitmap
22 import android.graphics.BitmapFactory
23 import android.graphics.Color
24 import android.graphics.drawable.ColorDrawable
25 import android.graphics.drawable.PaintDrawable
26 import android.graphics.drawable.Drawable
27 import android.os.Bundle
28 import android.provider.Settings
29 import android.util.TypedValue
30 import android.view.View
31 import android.view.WindowManager
32 import android.widget.ImageView
33 import android.widget.SeekBar
34 import android.widget.Switch
35 import android.widget.TextView
36 import com.android.test.silkfx.R
37 import com.android.internal.graphics.drawable.BackgroundBlurDrawable
38 import android.widget.LinearLayout
39 import android.widget.Button
40 
41 import android.view.ViewRootImpl
42 
43 class BackgroundBlurActivity : Activity(), SeekBar.OnSeekBarChangeListener  {
44     var mBackgroundDrawable = PaintDrawable(Color.WHITE)
45     var mBackgroundBlurRadius = 50
46     var mAlphaWithBlur = 0.2f
47     var mAlphaNoBlur = 0.5f
48 
49     var mBlurBehindRadius = 10
50     var mDimAmountWithBlur = 0.2f
51     var mDimAmountNoBlur = 0.2f
52 
53     var mBlurForceDisabled = false
54     var mBatterySavingModeOn = false
55 
56     lateinit var blurBackgroundSeekBar: SeekBar
57     lateinit var backgroundAlphaSeekBar : SeekBar
58     lateinit var blurBehindSeekBar : SeekBar
59     lateinit var dimAmountSeekBar : SeekBar
60 
61     val blurEnabledListener = { enabled : Boolean ->
62         blurBackgroundSeekBar.setProgress(mBackgroundBlurRadius)
63         blurBehindSeekBar.setProgress(mBlurBehindRadius)
64 
65         if (enabled) {
66             setBackgroundBlur(mBackgroundBlurRadius)
67             setBackgroundColorAlpha(mAlphaWithBlur)
68 
69             setBlurBehind(mBlurBehindRadius)
70             setDimAmount(mDimAmountWithBlur)
71 
72             backgroundAlphaSeekBar.setProgress((mAlphaWithBlur * 100).toInt())
73             dimAmountSeekBar.setProgress((mDimAmountWithBlur * 100).toInt())
74         } else {
75             setBackgroundColorAlpha(mAlphaNoBlur)
76             setDimAmount(mDimAmountNoBlur)
77 
78             backgroundAlphaSeekBar.setProgress((mAlphaNoBlur * 100).toInt())
79             dimAmountSeekBar.setProgress((mDimAmountNoBlur * 100).toInt())
80         }
81     }
82 
83     override fun onCreate(savedInstanceState: Bundle?) {
84         super.onCreate(savedInstanceState)
85         setContentView(R.layout.activity_background_blur)
86 
87         window.addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND)
88         window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
89 
90         mBackgroundDrawable.setCornerRadius(30f)
91         window.setBackgroundDrawable(mBackgroundDrawable)
92 
93         mBatterySavingModeOn =
94             Settings.Global.getInt(getContentResolver(), Settings.Global.LOW_POWER_MODE, 0) == 1
95         setBatterySavingModeOn(mBatterySavingModeOn)
96 
97         blurBackgroundSeekBar = requireViewById(R.id.set_background_blur)
98         backgroundAlphaSeekBar = requireViewById(R.id.set_background_alpha)
99         blurBehindSeekBar = requireViewById(R.id.set_blur_behind)
100         dimAmountSeekBar = requireViewById(R.id.set_dim_amount)
101 
102         arrayOf(blurBackgroundSeekBar, backgroundAlphaSeekBar, blurBehindSeekBar, dimAmountSeekBar)
103                 .forEach {
104                     it.setOnSeekBarChangeListener(this)
105                 }
106     }
107 
108     override fun onAttachedToWindow() {
109         super.onAttachedToWindow()
110         getWindowManager().addCrossWindowBlurEnabledListener(blurEnabledListener)
111     }
112 
113     override fun onDetachedFromWindow() {
114         super.onDetachedFromWindow()
115         getWindowManager().removeCrossWindowBlurEnabledListener(blurEnabledListener)
116     }
117 
118     override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
119         when (seekBar) {
120             blurBackgroundSeekBar -> setBackgroundBlur(progress)
121             backgroundAlphaSeekBar -> setBackgroundColorAlpha(progress / 100.0f)
122             blurBehindSeekBar -> setBlurBehind(progress)
123             dimAmountSeekBar -> setDimAmount(progress / 100.0f)
124             else -> throw IllegalArgumentException("Unknown seek bar")
125         }
126     }
127 
128     override fun onStartTrackingTouch(seekBar: SeekBar?) {}
129     override fun onStopTrackingTouch(seekBar: SeekBar?) {}
130 
131     fun setBlurDisabled(disabled: Boolean) {
132         mBlurForceDisabled = disabled
133         Settings.Global.putInt(getContentResolver(), Settings.Global.DISABLE_WINDOW_BLURS,
134                 if (mBlurForceDisabled) 1 else 0)
135         (findViewById(R.id.toggle_blur_enabled) as Button)
136                 .setText(if (mBlurForceDisabled) "Enable blurs" else "Disable blurs")
137     }
138 
139     fun toggleForceBlurDisabled(v: View) {
140         setBlurDisabled(!mBlurForceDisabled)
141     }
142 
143     fun setBackgroundBlur(radius: Int) {
144         mBackgroundBlurRadius = radius
145         (findViewById(R.id.background_blur_radius) as TextView).setText(radius.toString())
146         window.setBackgroundBlurRadius(mBackgroundBlurRadius)
147     }
148 
149     fun setBlurBehind(radius: Int) {
150         mBlurBehindRadius = radius
151         (findViewById(R.id.blur_behind_radius) as TextView).setText(radius.toString())
152         window.getAttributes().setBlurBehindRadius(mBlurBehindRadius)
153         window.setAttributes(window.getAttributes())
154     }
155 
156     fun setDimAmount(amount: Float) {
157         if (getWindowManager().isCrossWindowBlurEnabled()) {
158             mDimAmountWithBlur = amount
159         } else {
160             mDimAmountNoBlur = amount
161         }
162         (findViewById(R.id.dim_amount) as TextView).setText("%.2f".format(amount))
163         window.getAttributes().dimAmount = amount
164         window.setAttributes(window.getAttributes())
165     }
166 
167     fun setBatterySavingModeOn(on: Boolean) {
168         mBatterySavingModeOn = on
169         Settings.Global.putInt(getContentResolver(),
170             Settings.Global.LOW_POWER_MODE, if (on) 1 else 0)
171         (findViewById(R.id.toggle_battery_saving_mode) as Button).setText(
172             if (on) "Exit low power mode" else "Enter low power mode")
173     }
174 
175     fun toggleBatterySavingMode(v: View) {
176         setBatterySavingModeOn(!mBatterySavingModeOn)
177     }
178 
179     fun setBackgroundColorAlpha(alpha: Float) {
180         if (getWindowManager().isCrossWindowBlurEnabled()) {
181             mAlphaWithBlur = alpha
182         } else {
183             mAlphaNoBlur = alpha
184         }
185         (findViewById(R.id.background_alpha) as TextView).setText("%.2f".format(alpha))
186         mBackgroundDrawable.setAlpha((alpha * 255f).toInt())
187         getWindowManager().updateViewLayout(window.getDecorView(), window.getAttributes())
188     }
189 }
190