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