19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.preference;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasaniimport android.app.Dialog;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
229b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasaniimport android.os.Parcel;
239b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasaniimport android.os.Parcelable;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
2569f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissenimport android.view.KeyEvent;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.SeekBar;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
295c3188e75e33c8edaf18af71fa681cd7759aee87Alan Viveretteimport com.android.internal.R;
305c3188e75e33c8edaf18af71fa681cd7759aee87Alan Viverette
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
34014fea2a663ab0bc2d80a6293b84b2647a4a1895John Reckpublic class VolumePreference extends SeekBarDialogPreference implements
3574a2e06d831432f27ebd17cf6f1d0086356e7ee0John Spurlock        PreferenceManager.OnActivityStopListener, View.OnKeyListener, SeekBarVolumizer.Callback {
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mStreamType;
379b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** May be null if the dialog isn't visible. */
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SeekBarVolumizer mSeekBarVolumizer;
40014fea2a663ab0bc2d80a6293b84b2647a4a1895John Reck
41617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    public VolumePreference(
42617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
43617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette        super(context, attrs, defStyleAttr, defStyleRes);
44014fea2a663ab0bc2d80a6293b84b2647a4a1895John Reck
45617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette        final TypedArray a = context.obtainStyledAttributes(attrs,
465c3188e75e33c8edaf18af71fa681cd7759aee87Alan Viverette                R.styleable.VolumePreference, defStyleAttr, defStyleRes);
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStreamType = a.getInt(android.R.styleable.VolumePreference_streamType, 0);
48998127c8049f22cb6f74483f11d693bfd7c59511Amith Yamasani        a.recycle();
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
509b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
51617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    public VolumePreference(Context context, AttributeSet attrs, int defStyleAttr) {
52617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette        this(context, attrs, defStyleAttr, 0);
53617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    }
54617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette
55617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    public VolumePreference(Context context, AttributeSet attrs) {
565c3188e75e33c8edaf18af71fa681cd7759aee87Alan Viverette        this(context, attrs, R.attr.seekBarDialogPreferenceStyle);
575c3188e75e33c8edaf18af71fa681cd7759aee87Alan Viverette    }
585c3188e75e33c8edaf18af71fa681cd7759aee87Alan Viverette
595c3188e75e33c8edaf18af71fa681cd7759aee87Alan Viverette    public VolumePreference(Context context) {
605c3188e75e33c8edaf18af71fa681cd7759aee87Alan Viverette        this(context, null);
61617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    }
62617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setStreamType(int streamType) {
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStreamType = streamType;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onBindDialogView(View view) {
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onBindDialogView(view);
70014fea2a663ab0bc2d80a6293b84b2647a4a1895John Reck
715c3188e75e33c8edaf18af71fa681cd7759aee87Alan Viverette        final SeekBar seekBar = (SeekBar) view.findViewById(R.id.seekbar);
7295caba127051845ff1e26d7e64909db89408e8e7John Spurlock        mSeekBarVolumizer = new SeekBarVolumizer(getContext(), mStreamType, null, this);
730e588ea8e1746f3335b2b5c8a51fdd9a96167b59John Spurlock        mSeekBarVolumizer.start();
7495caba127051845ff1e26d7e64909db89408e8e7John Spurlock        mSeekBarVolumizer.setSeekBar(seekBar);
759b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getPreferenceManager().registerOnActivityStopListener(this);
7769f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen
7869f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen        // grab focus and key events so that pressing the volume buttons in the
7969f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen        // dialog doesn't also show the normal volume adjust toast.
8069f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen        view.setOnKeyListener(this);
8169f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen        view.setFocusableInTouchMode(true);
8269f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen        view.requestFocus();
8369f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen    }
8469f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen
8569f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen    public boolean onKey(View v, int keyCode, KeyEvent event) {
866ff5906981fac2aa67c8c1f0df151b536e80ccafAmith Yamasani        // If key arrives immediately after the activity has been cleaned up.
876ff5906981fac2aa67c8c1f0df151b536e80ccafAmith Yamasani        if (mSeekBarVolumizer == null) return true;
8869f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen        boolean isdown = (event.getAction() == KeyEvent.ACTION_DOWN);
8969f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen        switch (keyCode) {
9069f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen            case KeyEvent.KEYCODE_VOLUME_DOWN:
9169f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen                if (isdown) {
9269f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen                    mSeekBarVolumizer.changeVolumeBy(-1);
9369f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen                }
9469f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen                return true;
9569f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen            case KeyEvent.KEYCODE_VOLUME_UP:
9669f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen                if (isdown) {
9769f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen                    mSeekBarVolumizer.changeVolumeBy(1);
9869f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen                }
9969f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen                return true;
100b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown            case KeyEvent.KEYCODE_VOLUME_MUTE:
101b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown                if (isdown) {
102b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown                    mSeekBarVolumizer.muteVolume();
103b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown                }
104b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown                return true;
10569f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen            default:
10669f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen                return false;
10769f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen        }
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onDialogClosed(boolean positiveResult) {
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onDialogClosed(positiveResult);
113014fea2a663ab0bc2d80a6293b84b2647a4a1895John Reck
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!positiveResult && mSeekBarVolumizer != null) {
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSeekBarVolumizer.revertVolume();
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1179b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cleanup();
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onActivityStop() {
122a458868fd432d4b106f2beddec8bdb2a65808fdbSamuel Asteberg        if (mSeekBarVolumizer != null) {
123735f9ebc188e1cb225533e1f5f9ef925d1f0b20eJohn Spurlock            mSeekBarVolumizer.stopSample();
124a458868fd432d4b106f2beddec8bdb2a65808fdbSamuel Asteberg        }
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Do clean up.  This can be called multiple times!
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void cleanup() {
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       getPreferenceManager().unregisterOnActivityStopListener(this);
1329b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       if (mSeekBarVolumizer != null) {
1345c3188e75e33c8edaf18af71fa681cd7759aee87Alan Viverette           final Dialog dialog = getDialog();
1359b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani           if (dialog != null && dialog.isShowing()) {
1365c3188e75e33c8edaf18af71fa681cd7759aee87Alan Viverette               final View view = dialog.getWindow().getDecorView().findViewById(R.id.seekbar);
1375c3188e75e33c8edaf18af71fa681cd7759aee87Alan Viverette               if (view != null) {
1385c3188e75e33c8edaf18af71fa681cd7759aee87Alan Viverette                   view.setOnKeyListener(null);
1395c3188e75e33c8edaf18af71fa681cd7759aee87Alan Viverette               }
1405c3188e75e33c8edaf18af71fa681cd7759aee87Alan Viverette
1419b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani               // Stopped while dialog was showing, revert changes
1429b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani               mSeekBarVolumizer.revertVolume();
1439b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani           }
1445c3188e75e33c8edaf18af71fa681cd7759aee87Alan Viverette
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           mSeekBarVolumizer.stop();
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           mSeekBarVolumizer = null;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       }
1489b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1509b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
15174a2e06d831432f27ebd17cf6f1d0086356e7ee0John Spurlock    @Override
15274a2e06d831432f27ebd17cf6f1d0086356e7ee0John Spurlock    public void onSampleStarting(SeekBarVolumizer volumizer) {
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mSeekBarVolumizer != null && volumizer != mSeekBarVolumizer) {
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSeekBarVolumizer.stopSample();
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1579b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
1589b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani    @Override
159bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
160bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock        // noop
161bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock    }
162bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock
163bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock    @Override
16496d4a9ec394975818b073b537ccb6220ef0949baJohn Spurlock    public void onMuted(boolean muted, boolean zenMuted) {
165bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock        // noop
166bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock    }
167bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock
168bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock    @Override
1699b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani    protected Parcelable onSaveInstanceState() {
1709b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        final Parcelable superState = super.onSaveInstanceState();
1719b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        if (isPersistent()) {
1729b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            // No need to save instance state since it's persistent
1739b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            return superState;
1749b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        }
1759b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
1769b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        final SavedState myState = new SavedState(superState);
1779b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        if (mSeekBarVolumizer != null) {
1789b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            mSeekBarVolumizer.onSaveInstanceState(myState.getVolumeStore());
1799b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        }
1809b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        return myState;
1819b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani    }
1829b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
1839b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani    @Override
1849b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani    protected void onRestoreInstanceState(Parcelable state) {
1859b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        if (state == null || !state.getClass().equals(SavedState.class)) {
1869b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            // Didn't save state for us in onSaveInstanceState
1879b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            super.onRestoreInstanceState(state);
1889b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            return;
1899b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        }
1909b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
1919b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        SavedState myState = (SavedState) state;
1929b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        super.onRestoreInstanceState(myState.getSuperState());
1939b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        if (mSeekBarVolumizer != null) {
1949b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            mSeekBarVolumizer.onRestoreInstanceState(myState.getVolumeStore());
1959b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        }
1969b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani    }
1979b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
1989b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani    public static class VolumeStore {
1999b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        public int volume = -1;
2009b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        public int originalVolume = -1;
2019b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani    }
2029b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
2039b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani    private static class SavedState extends BaseSavedState {
2049b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        VolumeStore mVolumeStore = new VolumeStore();
2059b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
2069b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        public SavedState(Parcel source) {
2079b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            super(source);
2089b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            mVolumeStore.volume = source.readInt();
2099b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            mVolumeStore.originalVolume = source.readInt();
2109b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        }
2119b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
2129b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        @Override
2139b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        public void writeToParcel(Parcel dest, int flags) {
2149b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            super.writeToParcel(dest, flags);
2159b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            dest.writeInt(mVolumeStore.volume);
2169b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            dest.writeInt(mVolumeStore.originalVolume);
2179b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        }
2189b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
2199b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        VolumeStore getVolumeStore() {
2209b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            return mVolumeStore;
2219b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        }
2229b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
2239b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        public SavedState(Parcelable superState) {
2249b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            super(superState);
2259b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        }
2269b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
2279b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        public static final Parcelable.Creator<SavedState> CREATOR =
2289b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani                new Parcelable.Creator<SavedState>() {
2299b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            public SavedState createFromParcel(Parcel in) {
2309b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani                return new SavedState(in);
2319b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            }
2329b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
2339b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            public SavedState[] newArray(int size) {
2349b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani                return new SavedState[size];
2359b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            }
2369b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        };
2379b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani    }
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
239