1/*
2 * Copyright (C) 2006 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
17package android.app.activity;
18
19import android.app.Activity;
20import android.app.PendingIntent;
21import android.content.Intent;
22import android.os.Bundle;
23
24public class SubActivityScreen extends Activity {
25    static final int NO_RESULT_MODE = 0;
26    static final int RESULT_MODE = 1;
27    static final int PENDING_RESULT_MODE = 2;
28    static final int FINISH_SUB_MODE = 3;
29
30    static final int CHILD_OFFSET = 1000;
31
32    int mMode;
33
34    public SubActivityScreen() {
35    }
36
37    @Override
38    public void onCreate(Bundle icicle) {
39        super.onCreate(icicle);
40        mMode = getIntent().getIntExtra("mode", mMode);
41        //Log.i("foo", "SubActivityScreen pid=" + Process.myPid()
42        //        + " mode=" + mMode);
43
44        // Move on to the next thing that will generate a result...  but only
45        // if we are being launched for the first time.
46        if (icicle == null) {
47            if (mMode == PENDING_RESULT_MODE) {
48                PendingIntent apr = createPendingResult(1, null,
49                        Intent.FILL_IN_ACTION);
50                Intent res = new Intent();
51                res.putExtra("tkey", "tval");
52                res.setAction("test");
53                try {
54                    apr.send(this, RESULT_OK, res);
55                } catch (PendingIntent.CanceledException e) {
56                }
57            } else if (mMode < CHILD_OFFSET) {
58                Intent intent = new Intent();
59                intent.setClass(this, SubActivityScreen.class);
60                intent.putExtra("mode", CHILD_OFFSET+mMode);
61                //System.out.println("*** Starting from onStart: " + intent);
62                startActivityForResult(intent, 1);
63                return;
64            }
65        }
66    }
67
68    @Override
69    protected void onRestoreInstanceState(Bundle state) {
70        super.onRestoreInstanceState(state);
71    }
72
73    @Override
74    protected void onResume() {
75        super.onResume();
76
77        //Log.i("foo", "SubActivityScreen pid=" + Process.myPid() + " onResume");
78
79        if (mMode >= CHILD_OFFSET) {
80            // Wait a little bit, to give our parent time to kill itself
81            // if that is something it is into.
82            try {
83                Thread.sleep(500);
84            } catch (InterruptedException e) {
85                setResult(RESULT_CANCELED, (new Intent()).setAction("Interrupted!"));
86                finish();
87                return;
88            }
89            //System.out.println("Resuming sub-activity: mode=" + mMode);
90            switch (mMode-CHILD_OFFSET) {
91            case NO_RESULT_MODE:
92                finish();
93                break;
94            case RESULT_MODE:
95                Intent res = new Intent();
96                res.putExtra("tkey", "tval");
97                res.setAction("test");
98                setResult(RESULT_OK, res);
99                finish();
100                break;
101            case FINISH_SUB_MODE:
102                break;
103            }
104        }
105    }
106
107    @Override
108    protected void onActivityResult(int requestCode, int resultCode,
109            Intent data) {
110        //Log.i("foo", "SubActivityScreen pid=" + Process.myPid()
111        //        + " onActivityResult: req=" + requestCode
112        //        + " res=" + resultCode);
113
114        // Assume success.
115        setResult(RESULT_OK);
116
117        if (requestCode == 1) {
118            switch (mMode) {
119            case NO_RESULT_MODE:
120            case FINISH_SUB_MODE:
121                if (resultCode != RESULT_CANCELED) {
122                    setResult(RESULT_CANCELED, (new Intent()).setAction(
123                            "Incorrect result code returned: " + resultCode));
124                }
125                break;
126            case RESULT_MODE:
127            case PENDING_RESULT_MODE:
128                if (resultCode != RESULT_OK) {
129                    setResult(RESULT_CANCELED, (new Intent()).setAction(
130                            "Incorrect result code returned: " + resultCode));
131                } else if (data == null) {
132                    setResult(RESULT_CANCELED, (new Intent()).setAction(
133                            "null data returned"));
134                } else if (!("test".equals(data.getAction()))) {
135                    setResult(RESULT_CANCELED, (new Intent()).setAction(
136                            "Incorrect action returned: " + data));
137                } else if (!("tval".equals(data.getStringExtra("tkey")))) {
138                    setResult(RESULT_CANCELED, (new Intent()).setAction(
139                            "Incorrect extras returned: " + data.getExtras()));
140                }
141                break;
142            }
143        } else {
144            setResult(RESULT_CANCELED, (new Intent()).setAction(
145                    "Incorrect request code returned: " + requestCode));
146        }
147
148        finish();
149    }
150
151    @Override
152    protected void onSaveInstanceState(Bundle outState) {
153        super.onSaveInstanceState(outState);
154    }
155
156    @Override
157    protected void onStop() {
158        super.onStop();
159        handleBeforeStopping();
160    }
161
162    public void handleBeforeStopping() {
163        if (mMode == FINISH_SUB_MODE) {
164            finishActivity(1);
165        }
166    }
167}
168
169