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() { 66c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn public void onClick(View v) { 67c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn mWorkFragment.restart(); 68c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 69c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn }); 70c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 71c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn return v; 72c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 73c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 74c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn @Override 75c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn public void onActivityCreated(Bundle savedInstanceState) { 76c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn super.onActivityCreated(savedInstanceState); 77c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 78c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn FragmentManager fm = getFragmentManager(); 79c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 80c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // Check to see if we have retained the worker fragment. 81c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn mWorkFragment = (RetainedFragment)fm.findFragmentByTag("work"); 82c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 83c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // If not retained (or first time running), we need to create it. 84c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn if (mWorkFragment == null) { 85c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn mWorkFragment = new RetainedFragment(); 86c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // Tell it who it is working with. 87c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn mWorkFragment.setTargetFragment(this, 0); 88c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn fm.beginTransaction().add(mWorkFragment, "work").commit(); 89c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 90c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 91c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 92c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 93c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 94c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn /** 95c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * This is the Fragment implementation that will be retained across 96c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * activity instances. It represents some ongoing work, here a thread 97c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * we have that sits around incrementing a progress indicator. 98c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn */ 99c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn public static class RetainedFragment extends Fragment { 100c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn ProgressBar mProgressBar; 101c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn int mPosition; 102c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn boolean mReady = false; 103c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn boolean mQuiting = false; 104c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 105c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn /** 106c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * This is the thread that will do our work. It sits in a loop running 107c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * the progress up until it has reached the top, then stops and waits. 108c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn */ 109c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn final Thread mThread = new Thread() { 110c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn @Override 111c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn public void run() { 112c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // We'll figure the real value out later. 113c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn int max = 10000; 114c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 115c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // This thread runs almost forever. 116c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn while (true) { 117c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 118c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // Update our shared state with the UI. 119c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn synchronized (this) { 120c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // Our thread is stopped if the UI is not ready 121c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // or it has completed its work. 122c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn while (!mReady || mPosition >= max) { 123c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn if (mQuiting) { 124c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn return; 125c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 126c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn try { 127c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn wait(); 128c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } catch (InterruptedException e) { 129c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 130c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 131c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 132c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // Now update the progress. Note it is important that 133c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // we touch the progress bar with the lock held, so it 134c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // doesn't disappear on us. 135c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn mPosition++; 136c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn max = mProgressBar.getMax(); 137c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn mProgressBar.setProgress(mPosition); 138c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 139c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 140c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // Normally we would be doing some work, but put a kludge 141c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // here to pretend like we are. 142c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn synchronized (this) { 143c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn try { 144c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn wait(50); 145c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } catch (InterruptedException e) { 146c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 147c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 148c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 149c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 150c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn }; 151c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 152c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn /** 153c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * Fragment initialization. We way we want to be retained and 154c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * start our thread. 155c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn */ 156c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn @Override 157c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn public void onCreate(Bundle savedInstanceState) { 158c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn super.onCreate(savedInstanceState); 159c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 160c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // Tell the framework to try to keep this fragment around 161c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // during a configuration change. 162c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn setRetainInstance(true); 163c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 164c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // Start up the worker thread. 165c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn mThread.start(); 166c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 167c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 168c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn /** 169c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * This is called when the Fragment's Activity is ready to go, after 170c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * its content view has been installed; it is called both after 171c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * the initial fragment creation and after the fragment is re-attached 172c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * to a new activity. 173c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn */ 174c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn @Override 175c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn public void onActivityCreated(Bundle savedInstanceState) { 176c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn super.onActivityCreated(savedInstanceState); 177c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 178c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // Retrieve the progress bar from the target's view hierarchy. 179c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn mProgressBar = (ProgressBar)getTargetFragment().getView().findViewById( 180c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn R.id.progress_horizontal); 181c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 182c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // We are ready for our thread to go. 183c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn synchronized (mThread) { 184c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn mReady = true; 185c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn mThread.notify(); 186c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 187c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 188c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 189c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn /** 190c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * This is called when the fragment is going away. It is NOT called 191c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * when the fragment is being propagated between activity instances. 192c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn */ 193c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn @Override 194c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn public void onDestroy() { 195c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // Make the thread go away. 196c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn synchronized (mThread) { 197c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn mReady = false; 198c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn mQuiting = true; 199c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn mThread.notify(); 200c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 201c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 202c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn super.onDestroy(); 203c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 204c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 205c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn /** 206c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * This is called right before the fragment is detached from its 207c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * current activity instance. 208c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn */ 209c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn @Override 210c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn public void onDetach() { 211c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // This fragment is being detached from its activity. We need 212c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // to make sure its thread is not going to touch any activity 213c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // state after returning from this function. 214c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn synchronized (mThread) { 215c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn mProgressBar = null; 216c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn mReady = false; 217c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn mThread.notify(); 218c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 219c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 220c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn super.onDetach(); 221c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 222c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 223c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn /** 224c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * API for our UI to restart the progress thread. 225c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn */ 226c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn public void restart() { 227c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn synchronized (mThread) { 228c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn mPosition = 0; 229c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn mThread.notify(); 230c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 231c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 232c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 233c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn} 234