1c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn/*
2c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * Copyright (C) 2011 The Android Open Source Project
3c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn *
4c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
5c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * you may not use this file except in compliance with the License.
6c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * You may obtain a copy of the License at
7c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn *
8c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
9c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn *
10c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * Unless required by applicable law or agreed to in writing, software
11c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
12c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * See the License for the specific language governing permissions and
14c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * limitations under the License.
15c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn */
16c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
17c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornpackage com.example.android.supportv4.app;
18c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
19c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornimport com.example.android.supportv4.R;
20c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
21c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornimport android.support.v4.app.Fragment;
22c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornimport android.support.v4.app.FragmentActivity;
23c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornimport android.support.v4.app.FragmentManager;
24c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
25c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornimport android.os.Bundle;
26c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornimport android.view.LayoutInflater;
27c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornimport android.view.View;
28c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornimport android.view.ViewGroup;
29c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornimport android.view.View.OnClickListener;
30c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornimport android.widget.Button;
31c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornimport android.widget.ProgressBar;
32c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
33c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn/**
34c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * This example shows how you can use a Fragment to easily propagate state
35c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * (such as threads) across activity instances when an activity needs to be
36c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * restarted due to, for example, a configuration change.  This is a lot
37c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * easier than using the raw Activity.onRetainNonConfiguratinInstance() API.
38c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn */
39c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornpublic class FragmentRetainInstanceSupport extends FragmentActivity {
40c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn    @Override
41c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn    protected void onCreate(Bundle savedInstanceState) {
42c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        super.onCreate(savedInstanceState);
43c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
44c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        // First time init, create the UI.
45c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        if (savedInstanceState == null) {
46c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            getSupportFragmentManager().beginTransaction().add(android.R.id.content,
47c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                    new UiFragment()).commit();
48c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        }
49c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn    }
50c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
51c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn    /**
52c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn     * This is a fragment showing UI that will be updated from work done
53c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn     * in the retained fragment.
54c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn     */
55c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn    public static class UiFragment extends Fragment {
56c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        RetainedFragment mWorkFragment;
57c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
58c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        @Override
59c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        public View onCreateView(LayoutInflater inflater, ViewGroup container,
60c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                Bundle savedInstanceState) {
61c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            View v = inflater.inflate(R.layout.fragment_retain_instance, container, false);
62c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
63c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            // Watch for button clicks.
64c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            Button button = (Button)v.findViewById(R.id.restart);
65c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            button.setOnClickListener(new OnClickListener() {
66e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas                @Override
67c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                public void onClick(View v) {
68c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                    mWorkFragment.restart();
69c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                }
70c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            });
71c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
72c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            return v;
73c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        }
74c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
75c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        @Override
76c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        public void onActivityCreated(Bundle savedInstanceState) {
77c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            super.onActivityCreated(savedInstanceState);
78c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
79c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            FragmentManager fm = getFragmentManager();
80c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
81c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            // Check to see if we have retained the worker fragment.
82c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            mWorkFragment = (RetainedFragment)fm.findFragmentByTag("work");
83c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
84c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            // If not retained (or first time running), we need to create it.
85c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            if (mWorkFragment == null) {
86c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                mWorkFragment = new RetainedFragment();
87c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                // Tell it who it is working with.
88c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                mWorkFragment.setTargetFragment(this, 0);
89c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                fm.beginTransaction().add(mWorkFragment, "work").commit();
90c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            }
91c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        }
92c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
93c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn    }
94c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
95c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn    /**
96c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn     * This is the Fragment implementation that will be retained across
97c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn     * activity instances.  It represents some ongoing work, here a thread
98c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn     * we have that sits around incrementing a progress indicator.
99c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn     */
100c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn    public static class RetainedFragment extends Fragment {
101c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        ProgressBar mProgressBar;
102c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        int mPosition;
103c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        boolean mReady = false;
104c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        boolean mQuiting = false;
105c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
106c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        /**
107c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn         * This is the thread that will do our work.  It sits in a loop running
108c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn         * the progress up until it has reached the top, then stops and waits.
109c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn         */
110c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        final Thread mThread = new Thread() {
111c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            @Override
112c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            public void run() {
113c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                // We'll figure the real value out later.
114c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                int max = 10000;
115c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
116c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                // This thread runs almost forever.
117c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                while (true) {
118c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
119c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                    // Update our shared state with the UI.
120c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                    synchronized (this) {
121c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                        // Our thread is stopped if the UI is not ready
122c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                        // or it has completed its work.
123c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                        while (!mReady || mPosition >= max) {
124c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                            if (mQuiting) {
125c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                                return;
126c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                            }
127c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                            try {
128c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                                wait();
129c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                            } catch (InterruptedException e) {
130c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                            }
131c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                        }
132c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
133c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                        // Now update the progress.  Note it is important that
134c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                        // we touch the progress bar with the lock held, so it
135c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                        // doesn't disappear on us.
136c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                        mPosition++;
137c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                        max = mProgressBar.getMax();
138c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                        mProgressBar.setProgress(mPosition);
139c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                    }
140c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
141c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                    // Normally we would be doing some work, but put a kludge
142c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                    // here to pretend like we are.
143c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                    synchronized (this) {
144c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                        try {
145c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                            wait(50);
146c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                        } catch (InterruptedException e) {
147c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                        }
148c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                    }
149c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                }
150c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            }
151c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        };
152c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
153c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        /**
154c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn         * Fragment initialization.  We way we want to be retained and
155c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn         * start our thread.
156c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn         */
157c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        @Override
158c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        public void onCreate(Bundle savedInstanceState) {
159c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            super.onCreate(savedInstanceState);
160c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
161c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            // Tell the framework to try to keep this fragment around
162c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            // during a configuration change.
163c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            setRetainInstance(true);
164c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
165c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            // Start up the worker thread.
166c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            mThread.start();
167c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        }
168c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
169c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        /**
170c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn         * This is called when the Fragment's Activity is ready to go, after
171c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn         * its content view has been installed; it is called both after
172c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn         * the initial fragment creation and after the fragment is re-attached
173c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn         * to a new activity.
174c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn         */
175c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        @Override
176c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        public void onActivityCreated(Bundle savedInstanceState) {
177c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            super.onActivityCreated(savedInstanceState);
178c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
179c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            // Retrieve the progress bar from the target's view hierarchy.
180c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            mProgressBar = (ProgressBar)getTargetFragment().getView().findViewById(
181c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                    R.id.progress_horizontal);
182c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
183c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            // We are ready for our thread to go.
184c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            synchronized (mThread) {
185c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                mReady = true;
186c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                mThread.notify();
187c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            }
188c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        }
189c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
190c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        /**
191c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn         * This is called when the fragment is going away.  It is NOT called
192c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn         * when the fragment is being propagated between activity instances.
193c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn         */
194c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        @Override
195c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        public void onDestroy() {
196c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            // Make the thread go away.
197c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            synchronized (mThread) {
198c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                mReady = false;
199c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                mQuiting = true;
200c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                mThread.notify();
201c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            }
202c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
203c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            super.onDestroy();
204c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        }
205c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
206c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        /**
207c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn         * This is called right before the fragment is detached from its
208c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn         * current activity instance.
209c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn         */
210c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        @Override
211c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        public void onDetach() {
212c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            // This fragment is being detached from its activity.  We need
213c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            // to make sure its thread is not going to touch any activity
214c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            // state after returning from this function.
215c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            synchronized (mThread) {
216c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                mProgressBar = null;
217c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                mReady = false;
218c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                mThread.notify();
219c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            }
220c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
221c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            super.onDetach();
222c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        }
223c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn
224c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        /**
225c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn         * API for our UI to restart the progress thread.
226c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn         */
227c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        public void restart() {
228c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            synchronized (mThread) {
229c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                mPosition = 0;
230c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn                mThread.notify();
231c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn            }
232c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn        }
233c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn    }
234c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn}
235