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