2020import android .app .AlarmManager ;
2121import android .app .INotificationManager ;
2222import android .content .BroadcastReceiver ;
23+ import android .content .ContentResolver ;
2324import android .content .Context ;
2425import android .content .Intent ;
2526import android .content .IntentFilter ;
27+ import android .database .ContentObserver ;
2628import android .net .Uri ;
2729import android .os .Handler ;
2830import android .os .RemoteException ;
2931import android .os .ServiceManager ;
3032import android .os .UserHandle ;
3133import android .provider .Settings .Global ;
34+ import android .provider .Settings .Secure ;
3235import android .service .notification .Condition ;
3336import android .service .notification .IConditionListener ;
3437import android .service .notification .ZenModeConfig ;
@@ -52,6 +55,7 @@ public class ZenModeControllerImpl implements ZenModeController {
5255 private final INotificationManager mNoMan ;
5356 private final LinkedHashMap <Uri , Condition > mConditions = new LinkedHashMap <Uri , Condition >();
5457 private final AlarmManager mAlarmManager ;
58+ private final SetupObserver mSetupObserver ;
5559
5660 private int mUserId ;
5761 private boolean mRequesting ;
@@ -76,6 +80,8 @@ protected void handleValueChanged(int value) {
7680 mNoMan = INotificationManager .Stub .asInterface (
7781 ServiceManager .getService (Context .NOTIFICATION_SERVICE ));
7882 mAlarmManager = (AlarmManager ) context .getSystemService (Context .ALARM_SERVICE );
83+ mSetupObserver = new SetupObserver (handler );
84+ mSetupObserver .register ();
7985 }
8086
8187 @ Override
@@ -98,6 +104,11 @@ public void setZen(int zen) {
98104 mModeSetting .setValue (zen );
99105 }
100106
107+ @ Override
108+ public boolean isZenAvailable () {
109+ return mSetupObserver .isDeviceProvisioned () && mSetupObserver .isUserSetup ();
110+ }
111+
101112 @ Override
102113 public void requestConditions (boolean request ) {
103114 mRequesting = request ;
@@ -148,6 +159,7 @@ public void setUserId(int userId) {
148159 mContext .registerReceiverAsUser (mReceiver , new UserHandle (mUserId ),
149160 new IntentFilter (AlarmManager .ACTION_NEXT_ALARM_CLOCK_CHANGED ), null , null );
150161 mRegistered = true ;
162+ mSetupObserver .register ();
151163 }
152164
153165 private void fireNextAlarmChanged () {
@@ -162,6 +174,12 @@ private void fireZenChanged(int zen) {
162174 }
163175 }
164176
177+ private void fireZenAvailableChanged (boolean available ) {
178+ for (Callback cb : mCallbacks ) {
179+ cb .onZenAvailableChanged (available );
180+ }
181+ }
182+
165183 private void fireConditionsChanged (Condition [] conditions ) {
166184 for (Callback cb : mCallbacks ) {
167185 cb .onConditionsChanged (conditions );
@@ -204,4 +222,42 @@ public void onReceive(Context context, Intent intent) {
204222 }
205223 }
206224 };
225+
226+ private final class SetupObserver extends ContentObserver {
227+ private final ContentResolver mResolver ;
228+
229+ private boolean mRegistered ;
230+
231+ public SetupObserver (Handler handler ) {
232+ super (handler );
233+ mResolver = mContext .getContentResolver ();
234+ }
235+
236+ public boolean isUserSetup () {
237+ return Secure .getIntForUser (mResolver , Secure .USER_SETUP_COMPLETE , 0 , mUserId ) != 0 ;
238+ }
239+
240+ public boolean isDeviceProvisioned () {
241+ return Global .getInt (mResolver , Global .DEVICE_PROVISIONED , 0 ) != 0 ;
242+ }
243+
244+ public void register () {
245+ if (mRegistered ) {
246+ mResolver .unregisterContentObserver (this );
247+ }
248+ mResolver .registerContentObserver (
249+ Global .getUriFor (Global .DEVICE_PROVISIONED ), false , this );
250+ mResolver .registerContentObserver (
251+ Secure .getUriFor (Secure .USER_SETUP_COMPLETE ), false , this , mUserId );
252+ fireZenAvailableChanged (isZenAvailable ());
253+ }
254+
255+ @ Override
256+ public void onChange (boolean selfChange , Uri uri ) {
257+ if (Global .getUriFor (Global .DEVICE_PROVISIONED ).equals (uri )
258+ || Secure .getUriFor (Secure .USER_SETUP_COMPLETE ).equals (uri )) {
259+ fireZenAvailableChanged (isZenAvailable ());
260+ }
261+ }
262+ }
207263}
0 commit comments