1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.app.cts;
18 
19 import android.app.Instrumentation;
20 import android.app.ProgressDialog;
21 import android.app.stubs.MockActivity;
22 import android.content.Context;
23 import android.content.DialogInterface;
24 import android.content.DialogInterface.OnCancelListener;
25 import android.graphics.drawable.Drawable;
26 import android.os.Bundle;
27 import android.test.ActivityInstrumentationTestCase2;
28 import android.test.UiThreadTest;
29 import android.view.Window;
30 import android.widget.ProgressBar;
31 
32 import android.app.stubs.R;
33 
34 /**
35  * Test {@link ProgressDialog}.
36  */
37 public class ProgressDialogTest extends ActivityInstrumentationTestCase2<MockActivity> {
38     private final CharSequence TITLE = "title";
39     private final CharSequence MESSAGE = "message";
40 
41     private boolean mCanceled;
42     private Drawable mDrawable;
43     private Drawable mActualDrawableNull;
44     private Drawable mActualDrawable;
45     private ProgressBar mProgressBar;
46     private int mProgress1;
47     private int mProgress2;
48 
49     private Context mContext;
50     private Instrumentation mInstrumentation;
51     private MockActivity mActivity;
52 
ProgressDialogTest()53     public ProgressDialogTest() {
54         super("android.app.stubs", MockActivity.class);
55     }
56 
57     @Override
setUp()58     protected void setUp() throws Exception {
59         super.setUp();
60 
61         mCanceled = false;
62         mInstrumentation = getInstrumentation();
63         mActivity = getActivity();
64         mContext = mActivity;
65         mDrawable = getActivity().getResources().getDrawable(
66                 R.drawable.yellow);
67     }
68 
69     @UiThreadTest
testProgressDialog1()70     public void testProgressDialog1(){
71         new ProgressDialog(mContext);
72     }
73 
74     @UiThreadTest
testProgressDialog2()75     public void testProgressDialog2(){
76         new ProgressDialog(mContext, R.style.Theme_AlertDialog);
77     }
78 
79     @UiThreadTest
testOnStartCreateStop()80     public void testOnStartCreateStop() {
81         MockProgressDialog pd = new MockProgressDialog(mContext);
82 
83         assertFalse(pd.mIsOnCreateCalled);
84         assertFalse(pd.mIsOnStartCalled);
85         pd.show();
86         assertTrue(pd.mIsOnCreateCalled);
87         assertTrue(pd.mIsOnStartCalled);
88 
89         assertFalse(pd.mIsOnStopCalled);
90         pd.dismiss();
91         assertTrue(pd.mIsOnStopCalled);
92     }
93 
94     @UiThreadTest
testShow1()95     public void testShow1() {
96         ProgressDialog.show(mContext, TITLE, MESSAGE);
97     }
98 
99     @UiThreadTest
testShow2()100     public void testShow2() {
101         ProgressDialog dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, false);
102 
103         /*
104          * note: the progress bar's style only supports indeterminate mode,
105          * so can't change indeterminate
106          */
107         assertTrue(dialog.isIndeterminate());
108 
109         dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true);
110         assertTrue(dialog.isIndeterminate());
111     }
112 
testShow3()113     public void testShow3() throws Throwable {
114         final OnCancelListener cL = new OnCancelListener(){
115             public void onCancel(DialogInterface dialog) {
116                 mCanceled = true;
117             }
118         };
119 
120         // cancelable is false
121         runTestOnUiThread(new Runnable() {
122             public void run() {
123                 ProgressDialog dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true, false);
124 
125                 dialog.setOnCancelListener(cL);
126                 dialog.onBackPressed();
127                 dialog.dismiss();
128             }
129         });
130         mInstrumentation.waitForIdleSync();
131 
132         assertFalse(mCanceled);
133 
134         // cancelable is true
135         runTestOnUiThread(new Runnable() {
136             public void run() {
137                 ProgressDialog dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true, true);
138                 assertFalse(mCanceled);
139                 dialog.setOnCancelListener(cL);
140                 dialog.onBackPressed();
141             }
142         });
143         mInstrumentation.waitForIdleSync();
144 
145         assertTrue(mCanceled);
146     }
147 
testShow4()148     public void testShow4() throws Throwable {
149         final OnCancelListener cL = new OnCancelListener(){
150             public void onCancel(DialogInterface dialog) {
151                 mCanceled = true;
152             }
153         };
154 
155         // cancelable is false
156         runTestOnUiThread(new Runnable() {
157             public void run() {
158                 ProgressDialog dialog = ProgressDialog.show(
159                         mContext, TITLE, MESSAGE, true, false, cL);
160 
161                 dialog.onBackPressed();
162                 dialog.dismiss();;
163             }
164         });
165         mInstrumentation.waitForIdleSync();
166 
167         assertFalse(mCanceled);
168 
169         // cancelable is true
170         runTestOnUiThread(new Runnable() {
171             public void run() {
172                 ProgressDialog dialog = ProgressDialog.show(
173                         mContext, TITLE, MESSAGE, true, true, cL);
174 
175                 assertFalse(mCanceled);
176                 dialog.onBackPressed();
177             }
178         });
179         mInstrumentation.waitForIdleSync();
180 
181         assertTrue(mCanceled);
182     }
183 
184     @UiThreadTest
testAccessMax()185     public void testAccessMax() {
186         // progressDialog is null
187         ProgressDialog progressDialog = buildDialog();
188         progressDialog.setMax(2008);
189         assertEquals(2008, progressDialog.getMax());
190 
191         // progressDialog is not null
192         progressDialog = ProgressDialog.show(mContext, TITLE, MESSAGE);
193         progressDialog.setMax(2009);
194         assertEquals(2009, progressDialog.getMax());
195     }
196 
197     @UiThreadTest
testAccessProgress()198     public void testAccessProgress() {
199         // progressDialog is null
200         ProgressDialog progressDialog = buildDialog();
201         progressDialog.setProgress(11);
202         assertEquals(11, progressDialog.getProgress());
203 
204         /* progressDialog is not null
205          * note: the progress bar's style only supports indeterminate mode,
206          * so can't change progress
207          */
208         progressDialog = ProgressDialog.show(mContext, TITLE, MESSAGE);
209         progressDialog.setProgress(12);
210         assertEquals(0, progressDialog.getProgress());
211     }
212 
213     @UiThreadTest
testAccessSecondaryProgress()214     public void testAccessSecondaryProgress() {
215         // dialog is null
216         ProgressDialog dialog = buildDialog();
217         dialog.setSecondaryProgress(17);
218         assertEquals(17, dialog.getSecondaryProgress());
219 
220         /* mProgress is not null
221          * note: the progress bar's style only supports indeterminate mode,
222          * so can't change secondary progress
223          */
224         dialog = ProgressDialog.show(mContext, TITLE, MESSAGE);
225         dialog.setSecondaryProgress(18);
226         assertEquals(0, dialog.getSecondaryProgress());
227     }
228 
229     @UiThreadTest
testSetIndeterminate()230     public void testSetIndeterminate() {
231         // progress is null
232         ProgressDialog dialog = buildDialog();
233         dialog.setIndeterminate(true);
234         assertTrue(dialog.isIndeterminate());
235         dialog.setIndeterminate(false);
236         assertFalse(dialog.isIndeterminate());
237 
238         /* mProgress is not null
239          * note: the progress bar's style only supports indeterminate mode,
240          * so can't change indeterminate
241          */
242         dialog = ProgressDialog.show(mContext, TITLE, MESSAGE);
243         dialog.setIndeterminate(true);
244         assertTrue(dialog.isIndeterminate());
245         dialog.setIndeterminate(false);
246         assertTrue(dialog.isIndeterminate());
247     }
248 
249     @UiThreadTest
testIncrementProgressBy()250     public void testIncrementProgressBy() throws Throwable {
251         ProgressDialog dialog = new ProgressDialog(mContext);
252         dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
253         dialog.show();
254         dialog.setProgress(10);
255         mProgress1 = dialog.getProgress();
256         dialog.incrementProgressBy(60);
257         mProgress2 = dialog.getProgress();
258         dialog.cancel();
259 
260         assertEquals(10, mProgress1);
261         assertEquals(70, mProgress2);
262     }
263 
264     @UiThreadTest
testIncrementSecondaryProgressBy()265     public void testIncrementSecondaryProgressBy() throws Throwable {
266         ProgressDialog dialog = new ProgressDialog(mContext);
267         dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
268         dialog.show();
269         dialog.setSecondaryProgress(10);
270         mProgress1 = dialog.getSecondaryProgress();
271         dialog.incrementSecondaryProgressBy(60);
272         mProgress2 = dialog.getSecondaryProgress();
273 
274         assertEquals(10, mProgress1);
275         assertEquals(70, mProgress2);
276     }
277 
278     @UiThreadTest
testSetProgressDrawable()279     public void testSetProgressDrawable() throws Throwable {
280         ProgressDialog dialog = ProgressDialog.show(mContext, TITLE, MESSAGE);
281         Window w = dialog.getWindow();
282         ProgressBar progressBar = (ProgressBar) w.findViewById(android.R.id.progress);
283 
284         dialog.setProgressDrawable(mDrawable);
285         mActualDrawable = progressBar.getProgressDrawable();
286 
287         dialog.setProgressDrawable(null);
288         mActualDrawableNull = progressBar.getProgressDrawable();
289         assertEquals(mDrawable, mActualDrawable);
290         assertEquals(null, mActualDrawableNull);
291     }
292 
293     @UiThreadTest
testSetIndeterminateDrawable()294     public void testSetIndeterminateDrawable() throws Throwable {
295         ProgressDialog dialog = ProgressDialog.show(mContext, TITLE, MESSAGE);
296         Window w = dialog.getWindow();
297         mProgressBar = (ProgressBar) w.findViewById(android.R.id.progress);
298 
299         dialog.setIndeterminateDrawable(mDrawable);
300         mActualDrawable = mProgressBar.getIndeterminateDrawable();
301         assertEquals(mDrawable, mActualDrawable);
302 
303         dialog.setIndeterminateDrawable(null);
304         mActualDrawableNull = mProgressBar.getIndeterminateDrawable();
305         assertEquals(null, mActualDrawableNull);
306     }
307 
308     @UiThreadTest
testSetMessage()309     public void testSetMessage() throws Throwable {
310         ProgressDialog dialog = new ProgressDialog(mContext);
311         dialog = new ProgressDialog(mContext);
312         dialog.setMessage(MESSAGE);
313         dialog.show();
314         // dialog is not null
315         dialog = ProgressDialog.show(mContext, TITLE, MESSAGE);
316         dialog.setMessage("Chuck Norris");
317     }
318 
319     @UiThreadTest
testSetProgressStyle()320     public void testSetProgressStyle() throws Throwable {
321         ProgressDialog dialog = new ProgressDialog(mContext);
322         setProgressStyle(dialog, ProgressDialog.STYLE_HORIZONTAL);
323         setProgressStyle(dialog, ProgressDialog.STYLE_SPINNER);
324         setProgressStyle(dialog, 100);
325     }
326 
setProgressStyle(ProgressDialog dialog, int style)327     private void setProgressStyle(ProgressDialog dialog, int style) {
328         dialog.setProgressStyle(style);
329         dialog.show();
330         dialog.setProgress(10);
331         dialog.setMax(100);
332     }
333 
334     private static class MockProgressDialog extends ProgressDialog {
335         public boolean mIsOnStopCalled;
336         public boolean mIsOnStartCalled;
337         public boolean mIsOnCreateCalled;
338 
MockProgressDialog(Context context)339         public MockProgressDialog(Context context) {
340             super(context);
341         }
342 
343         @Override
onCreate(Bundle savedInstanceState)344         protected void onCreate(Bundle savedInstanceState) {
345             super.onCreate(savedInstanceState);
346             mIsOnCreateCalled = true;
347         }
348 
349         @Override
onStart()350         public void onStart(){
351             super.onStart();
352             mIsOnStartCalled = true;
353         }
354 
355         @Override
onStop()356         public void onStop() {
357             super.onStop();
358             mIsOnStopCalled = true;
359         }
360     }
361 
buildDialog()362     private ProgressDialog buildDialog() {
363         return new ProgressDialog(mContext);
364     }
365 }
366