Home | History | Annotate | Download | only in activity
      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 
     17 package android.app.activity;
     18 
     19 import android.app.Activity;
     20 import android.app.PendingIntent;
     21 import android.content.Intent;
     22 import android.os.Bundle;
     23 
     24 public 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