1 /*
2  * Copyright (C) 2021 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.car.settings.sound;
18 
19 
20 import android.content.Context;
21 import android.graphics.drawable.Drawable;
22 import android.os.Parcel;
23 import android.os.Parcelable;
24 import android.view.View.BaseSavedState;
25 
26 import com.android.car.settings.common.SeekBarPreference;
27 
28 final class VolumeSeekBarPreference extends SeekBarPreference {
29     private Drawable mMutedIcon;
30     private Drawable mUnMutedIcon;
31     private boolean mIsMuted = false;
32 
VolumeSeekBarPreference(Context context)33     VolumeSeekBarPreference(Context context) {
34         super(context);
35     }
36 
getUnMutedIcon()37     Drawable getUnMutedIcon() {
38         return mUnMutedIcon;
39     }
40 
setUnMutedIcon(Drawable unMutedIcon)41     void setUnMutedIcon(Drawable unMutedIcon) {
42         mUnMutedIcon = unMutedIcon;
43         if (mIsMuted) {
44             return;
45         }
46         setIcon(unMutedIcon);
47     }
48 
getMutedIcon()49     Drawable getMutedIcon() {
50         return mMutedIcon;
51     }
52 
setMutedIcon(Drawable mutedIcon)53     void setMutedIcon(Drawable mutedIcon) {
54         mMutedIcon = mutedIcon;
55         if (!mIsMuted) {
56             return;
57         }
58         setIcon(mutedIcon);
59     }
60 
setIsMuted(boolean isMuted)61     void setIsMuted(boolean isMuted) {
62         mIsMuted = isMuted;
63         if (isMuted) {
64             setIcon(mMutedIcon);
65         } else {
66             setIcon(mUnMutedIcon);
67         }
68     }
69 
isMuted()70     public boolean isMuted() {
71         return mIsMuted;
72     }
73 
74     @Override
onSaveInstanceState()75     protected Parcelable onSaveInstanceState() {
76         final Parcelable superState = super.onSaveInstanceState();
77         if (isPersistent()) {
78             // No need to save instance state since it's persistent
79             return superState;
80         }
81 
82         // Save the instance state
83         final SavedVolumeState myState = new SavedVolumeState(superState);
84         myState.setIsMuted(mIsMuted);
85         return myState;
86     }
87 
88     @Override
onRestoreInstanceState(Parcelable state)89     protected void onRestoreInstanceState(Parcelable state) {
90         if (!state.getClass().equals(SavedVolumeState.class)) {
91             // Didn't save state for us in onSaveInstanceState
92             super.onRestoreInstanceState(state);
93             return;
94         }
95 
96         // Restore the instance state
97         SavedVolumeState myState = (SavedVolumeState) state;
98         super.onRestoreInstanceState(myState.getSuperState());
99         setIsMuted(myState.isMuted());
100         notifyChanged();
101     }
102 
103     /**
104      * SavedVolumeState, a subclass of {@link BaseSavedState}, will store the state
105      * of volume seek bar preferences, a subclass of SeekBarPreference.
106      * <p>
107      * It is important to always call through to super methods.
108      */
109     public static class SavedVolumeState extends BaseSavedState {
110 
111         private boolean mIsMuted;
112 
isMuted()113         public boolean isMuted() {
114             return mIsMuted;
115         }
116 
setIsMuted(boolean muted)117         public void setIsMuted(boolean muted) {
118             mIsMuted = muted;
119         }
120 
SavedVolumeState(Parcel source)121         SavedVolumeState(Parcel source) {
122             super(source);
123 
124             mIsMuted = source.readBoolean();
125         }
126 
127         @Override
writeToParcel(Parcel dest, int flags)128         public void writeToParcel(Parcel dest, int flags) {
129             super.writeToParcel(dest, flags);
130 
131             dest.writeBoolean(mIsMuted);
132         }
133 
SavedVolumeState(Parcelable superState)134         private SavedVolumeState(Parcelable superState) {
135             super(superState);
136         }
137 
138         @SuppressWarnings("unused")
139         public static final Parcelable.Creator<SavedVolumeState> CREATOR =
140                 new Parcelable.Creator<SavedVolumeState>() {
141                     @Override
142                     public SavedVolumeState createFromParcel(Parcel in) {
143                         return new SavedVolumeState(in);
144                     }
145 
146                     @Override
147                     public SavedVolumeState[] newArray(int size) {
148                         return new SavedVolumeState[size];
149                     }
150                 };
151     }
152 }
153