1 /*
2  * Copyright (C) 2015 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 
17 package com.android.systemui.volume;
18 
19 import android.content.BroadcastReceiver;
20 import android.content.Context;
21 import android.content.DialogInterface;
22 import android.content.Intent;
23 import android.content.IntentFilter;
24 import android.media.AudioManager;
25 import android.util.Log;
26 import android.view.KeyEvent;
27 import android.view.WindowManager;
28 
29 import com.android.systemui.statusbar.phone.SystemUIDialog;
30 
31 abstract public class SafetyWarningDialog extends SystemUIDialog
32         implements DialogInterface.OnDismissListener, DialogInterface.OnClickListener {
33 
34     private static final String TAG = Util.logTag(SafetyWarningDialog.class);
35 
36     private static final int KEY_CONFIRM_ALLOWED_AFTER = 1000; // milliseconds
37 
38     private final Context mContext;
39     private final AudioManager mAudioManager;
40 
41     private long mShowTime;
42     private boolean mNewVolumeUp;
43 
SafetyWarningDialog(Context context, AudioManager audioManager)44     public SafetyWarningDialog(Context context, AudioManager audioManager) {
45         super(context);
46         mContext = context;
47         mAudioManager = audioManager;
48 
49         getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
50         setShowForAllUsers(true);
51         setMessage(mContext.getString(com.android.internal.R.string.safe_media_volume_warning));
52         setButton(DialogInterface.BUTTON_POSITIVE,
53                 mContext.getString(com.android.internal.R.string.yes), this);
54         setButton(DialogInterface.BUTTON_NEGATIVE,
55                 mContext.getString(com.android.internal.R.string.no), (OnClickListener) null);
56         setOnDismissListener(this);
57 
58         final IntentFilter filter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
59         context.registerReceiver(mReceiver, filter);
60     }
61 
cleanUp()62     abstract protected void cleanUp();
63 
64     @Override
onKeyDown(int keyCode, KeyEvent event)65     public boolean onKeyDown(int keyCode, KeyEvent event) {
66         if (keyCode == KeyEvent.KEYCODE_VOLUME_UP && event.getRepeatCount() == 0) {
67             mNewVolumeUp = true;
68         }
69         return super.onKeyDown(keyCode, event);
70     }
71 
72     @Override
onKeyUp(int keyCode, KeyEvent event)73     public boolean onKeyUp(int keyCode, KeyEvent event) {
74         if (keyCode == KeyEvent.KEYCODE_VOLUME_UP && mNewVolumeUp
75                 && (System.currentTimeMillis() - mShowTime) > KEY_CONFIRM_ALLOWED_AFTER) {
76             if (D.BUG) Log.d(TAG, "Confirmed warning via VOLUME_UP");
77             mAudioManager.disableSafeMediaVolume();
78             dismiss();
79         }
80         return super.onKeyUp(keyCode, event);
81     }
82 
83     @Override
onClick(DialogInterface dialog, int which)84     public void onClick(DialogInterface dialog, int which) {
85         mAudioManager.disableSafeMediaVolume();
86     }
87 
88     @Override
onStart()89     protected void onStart() {
90         super.onStart();
91         mShowTime = System.currentTimeMillis();
92     }
93 
94     @Override
onDismiss(DialogInterface unused)95     public void onDismiss(DialogInterface unused) {
96         mContext.unregisterReceiver(mReceiver);
97         cleanUp();
98     }
99 
100     private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
101         @Override
102         public void onReceive(Context context, Intent intent) {
103             if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) {
104                 if (D.BUG) Log.d(TAG, "Received ACTION_CLOSE_SYSTEM_DIALOGS");
105                 cancel();
106                 cleanUp();
107             }
108         }
109     };
110 }