VolumePreference.java revision bcc1087af40a0e1bb35dbe8a39c830ecdea8280b
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
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
32014fea2a663ab0bc2d80a6293b84b2647a4a1895John Reckpublic class VolumePreference extends SeekBarDialogPreference implements
3374a2e06d831432f27ebd17cf6f1d0086356e7ee0John Spurlock        PreferenceManager.OnActivityStopListener, View.OnKeyListener, SeekBarVolumizer.Callback {
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3574a2e06d831432f27ebd17cf6f1d0086356e7ee0John Spurlock    static final String TAG = "VolumePreference";
36014fea2a663ab0bc2d80a6293b84b2647a4a1895John Reck
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mStreamType;
389b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** May be null if the dialog isn't visible. */
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SeekBarVolumizer mSeekBarVolumizer;
41014fea2a663ab0bc2d80a6293b84b2647a4a1895John Reck
42617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    public VolumePreference(
43617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
44617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette        super(context, attrs, defStyleAttr, defStyleRes);
45014fea2a663ab0bc2d80a6293b84b2647a4a1895John Reck
46617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette        final TypedArray a = context.obtainStyledAttributes(attrs,
47617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette                com.android.internal.R.styleable.VolumePreference, defStyleAttr, defStyleRes);
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStreamType = a.getInt(android.R.styleable.VolumePreference_streamType, 0);
49998127c8049f22cb6f74483f11d693bfd7c59511Amith Yamasani        a.recycle();
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
519b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
52617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    public VolumePreference(Context context, AttributeSet attrs, int defStyleAttr) {
53617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette        this(context, attrs, defStyleAttr, 0);
54617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    }
55617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette
56617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    public VolumePreference(Context context, AttributeSet attrs) {
57fcb48b3ab94ab6f87b5e29f8d56a3939d4938129Alan Viverette        this(context, attrs, com.android.internal.R.attr.dialogPreferenceStyle);
58617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    }
59617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setStreamType(int streamType) {
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStreamType = streamType;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onBindDialogView(View view) {
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onBindDialogView(view);
67014fea2a663ab0bc2d80a6293b84b2647a4a1895John Reck
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final SeekBar seekBar = (SeekBar) view.findViewById(com.android.internal.R.id.seekbar);
6995caba127051845ff1e26d7e64909db89408e8e7John Spurlock        mSeekBarVolumizer = new SeekBarVolumizer(getContext(), mStreamType, null, this);
700e588ea8e1746f3335b2b5c8a51fdd9a96167b59John Spurlock        mSeekBarVolumizer.start();
7195caba127051845ff1e26d7e64909db89408e8e7John Spurlock        mSeekBarVolumizer.setSeekBar(seekBar);
729b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getPreferenceManager().registerOnActivityStopListener(this);
7469f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen
7569f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen        // grab focus and key events so that pressing the volume buttons in the
7669f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen        // dialog doesn't also show the normal volume adjust toast.
7769f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen        view.setOnKeyListener(this);
7869f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen        view.setFocusableInTouchMode(true);
7969f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen        view.requestFocus();
8069f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen    }
8169f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen
8269f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen    public boolean onKey(View v, int keyCode, KeyEvent event) {
836ff5906981fac2aa67c8c1f0df151b536e80ccafAmith Yamasani        // If key arrives immediately after the activity has been cleaned up.
846ff5906981fac2aa67c8c1f0df151b536e80ccafAmith Yamasani        if (mSeekBarVolumizer == null) return true;
8569f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen        boolean isdown = (event.getAction() == KeyEvent.ACTION_DOWN);
8669f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen        switch (keyCode) {
8769f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen            case KeyEvent.KEYCODE_VOLUME_DOWN:
8869f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen                if (isdown) {
8969f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen                    mSeekBarVolumizer.changeVolumeBy(-1);
9069f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen                }
9169f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen                return true;
9269f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen            case KeyEvent.KEYCODE_VOLUME_UP:
9369f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen                if (isdown) {
9469f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen                    mSeekBarVolumizer.changeVolumeBy(1);
9569f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen                }
9669f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen                return true;
97b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown            case KeyEvent.KEYCODE_VOLUME_MUTE:
98b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown                if (isdown) {
99b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown                    mSeekBarVolumizer.muteVolume();
100b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown                }
101b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown                return true;
10269f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen            default:
10369f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen                return false;
10469f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen        }
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onDialogClosed(boolean positiveResult) {
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onDialogClosed(positiveResult);
110014fea2a663ab0bc2d80a6293b84b2647a4a1895John Reck
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!positiveResult && mSeekBarVolumizer != null) {
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSeekBarVolumizer.revertVolume();
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1149b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cleanup();
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onActivityStop() {
119a458868fd432d4b106f2beddec8bdb2a65808fdbSamuel Asteberg        if (mSeekBarVolumizer != null) {
120735f9ebc188e1cb225533e1f5f9ef925d1f0b20eJohn Spurlock            mSeekBarVolumizer.stopSample();
121a458868fd432d4b106f2beddec8bdb2a65808fdbSamuel Asteberg        }
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Do clean up.  This can be called multiple times!
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void cleanup() {
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       getPreferenceManager().unregisterOnActivityStopListener(this);
1299b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       if (mSeekBarVolumizer != null) {
1319b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani           Dialog dialog = getDialog();
1329b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani           if (dialog != null && dialog.isShowing()) {
133e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani               View view = dialog.getWindow().getDecorView()
134e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                       .findViewById(com.android.internal.R.id.seekbar);
135e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani               if (view != null) view.setOnKeyListener(null);
1369b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani               // Stopped while dialog was showing, revert changes
1379b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani               mSeekBarVolumizer.revertVolume();
1389b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani           }
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           mSeekBarVolumizer.stop();
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           mSeekBarVolumizer = null;
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       }
1429b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1449b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
14574a2e06d831432f27ebd17cf6f1d0086356e7ee0John Spurlock    @Override
14674a2e06d831432f27ebd17cf6f1d0086356e7ee0John Spurlock    public void onSampleStarting(SeekBarVolumizer volumizer) {
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mSeekBarVolumizer != null && volumizer != mSeekBarVolumizer) {
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSeekBarVolumizer.stopSample();
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1519b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
1529b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani    @Override
153bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
154bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock        // noop
155bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock    }
156bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock
157bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock    @Override
158bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock    public void onMuted(boolean muted) {
159bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock        // noop
160bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock    }
161bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock
162bcc1087af40a0e1bb35dbe8a39c830ecdea8280bJohn Spurlock    @Override
1639b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani    protected Parcelable onSaveInstanceState() {
1649b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        final Parcelable superState = super.onSaveInstanceState();
1659b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        if (isPersistent()) {
1669b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            // No need to save instance state since it's persistent
1679b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            return superState;
1689b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        }
1699b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
1709b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        final SavedState myState = new SavedState(superState);
1719b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        if (mSeekBarVolumizer != null) {
1729b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            mSeekBarVolumizer.onSaveInstanceState(myState.getVolumeStore());
1739b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        }
1749b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        return myState;
1759b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani    }
1769b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
1779b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani    @Override
1789b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani    protected void onRestoreInstanceState(Parcelable state) {
1799b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        if (state == null || !state.getClass().equals(SavedState.class)) {
1809b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            // Didn't save state for us in onSaveInstanceState
1819b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            super.onRestoreInstanceState(state);
1829b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            return;
1839b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        }
1849b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
1859b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        SavedState myState = (SavedState) state;
1869b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        super.onRestoreInstanceState(myState.getSuperState());
1879b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        if (mSeekBarVolumizer != null) {
1889b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            mSeekBarVolumizer.onRestoreInstanceState(myState.getVolumeStore());
1899b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        }
1909b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani    }
1919b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
1929b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani    public static class VolumeStore {
1939b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        public int volume = -1;
1949b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        public int originalVolume = -1;
1959b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani    }
1969b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
1979b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani    private static class SavedState extends BaseSavedState {
1989b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        VolumeStore mVolumeStore = new VolumeStore();
1999b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
2009b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        public SavedState(Parcel source) {
2019b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            super(source);
2029b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            mVolumeStore.volume = source.readInt();
2039b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            mVolumeStore.originalVolume = source.readInt();
2049b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        }
2059b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
2069b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        @Override
2079b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        public void writeToParcel(Parcel dest, int flags) {
2089b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            super.writeToParcel(dest, flags);
2099b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            dest.writeInt(mVolumeStore.volume);
2109b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            dest.writeInt(mVolumeStore.originalVolume);
2119b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        }
2129b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
2139b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        VolumeStore getVolumeStore() {
2149b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            return mVolumeStore;
2159b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        }
2169b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
2179b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        public SavedState(Parcelable superState) {
2189b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            super(superState);
2199b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        }
2209b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
2219b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        public static final Parcelable.Creator<SavedState> CREATOR =
2229b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani                new Parcelable.Creator<SavedState>() {
2239b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            public SavedState createFromParcel(Parcel in) {
2249b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani                return new SavedState(in);
2259b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            }
2269b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani
2279b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            public SavedState[] newArray(int size) {
2289b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani                return new SavedState[size];
2299b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani            }
2309b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani        };
2319b4742cf25c2cd7e10d87554c1e8a60c6702edaaAmith Yamasani    }
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
233