Home | History | Annotate | Download | only in documentcentricapps
      1 /*
      2  * Copyright (C) 2014 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 com.example.android.documentcentricapps;
     18 
     19 import android.app.Activity;
     20 import android.content.Intent;
     21 import android.os.Bundle;
     22 import android.os.PersistableBundle;
     23 import android.util.Log;
     24 import android.view.View;
     25 import android.widget.CheckBox;
     26 
     27 /**
     28  * DocumentCentricActivity shows the basic usage of the new Document-Centric Apps API. The new
     29  * API modifies the meaning of the {@link Intent#FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET} flag, which is
     30  * now deprecated. In versions before L it serves to define a boundary between the main task and a
     31  * subtask. The subtask holds a different thumbnail and all activities in it are finished when the
     32  * task is reset. In L this flag causes a full break with the task that launched it. As such it has
     33  * been renamed to {@link Intent#FLAG_ACTIVITY_NEW_DOCUMENT}.
     34  *
     35  * This sample mainly uses Intent flags in code. But Activities can also specify in their manifests
     36  * that they shall always be launched into a new task in the above manner using the new activity
     37  * attribute documentLaunchMode which may take on one of three values, intoExisting equivalent to
     38  * NEW_DOCUMENT, always equivalent to NEW_DOCUMENT | MULTIPLE_TASK, none the default, and
     39  * never which will negate the effect of any attempt to launch the activity with NEW_DOCUMENT.
     40  */
     41 public class DocumentCentricActivity extends Activity {
     42 
     43     private final static String TAG = "DocumentCentricActivity";
     44 
     45     public final static String KEY_EXTRA_NEW_DOCUMENT_COUNTER = "KEY_EXTRA_NEW_DOCUMENT_COUNTER";
     46 
     47     private static int mDocumentCounter = 0;
     48 
     49     private CheckBox mCheckbox;
     50 
     51     @Override
     52     protected void onCreate(Bundle savedInstanceState) {
     53         super.onCreate(savedInstanceState);
     54         setContentView(R.layout.activity_document_centric_main);
     55         mCheckbox = (CheckBox) findViewById(R.id.multiple_task_checkbox);
     56     }
     57 
     58     @Override
     59     public void onPostCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
     60         super.onPostCreate(savedInstanceState, persistentState);
     61         // Restore state from PersistableBundle
     62         if (persistentState != null) {
     63             mDocumentCounter = persistentState.getInt(KEY_EXTRA_NEW_DOCUMENT_COUNTER);
     64         }
     65     }
     66 
     67     @Override
     68     public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
     69         /*
     70         To maintain activity state across reboots the system saves and restore critical information for
     71         all tasks and their activities. Information known by the system includes the activity stack order,
     72         each tasks thumbnails and each activitys and task's Intents. For Information that cannot be retained
     73         because they contain Bundles which cant be persisted a new constrained version of Bundle,
     74         PersistableBundle is added. PersistableBundle can store only basic data types. To use it
     75         in your Activities you must declare the new activity:persistableMode attribute in the manifest.
     76          */
     77         outPersistentState.putInt(KEY_EXTRA_NEW_DOCUMENT_COUNTER, mDocumentCounter);
     78         super.onSaveInstanceState(outState, outPersistentState);
     79     }
     80 
     81     public void createNewDocument(View view) {
     82         boolean useMultipleTasks = mCheckbox.isChecked();
     83         final Intent newDocumentIntent = newDocumentIntent();
     84         if (useMultipleTasks) {
     85             /*
     86             When {@linkIntent#FLAG_ACTIVITY_NEW_DOCUMENT} is used with {@link Intent#FLAG_ACTIVITY_MULTIPLE_TASK}
     87             the system will always create a new task with the target activity as the root. This allows the same
     88             document to be opened in more than one task.
     89              */
     90             newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
     91         }
     92         startActivity(newDocumentIntent);
     93     }
     94 
     95 
     96     /**
     97      * Returns an new {@link Intent} to start {@link NewDocumentActivity} as a new document in
     98      * overview menu.
     99      *
    100      * To start a new document task {@link Intent#FLAG_ACTIVITY_NEW_DOCUMENT} must be used. The
    101      * system will search through existing tasks for one whose Intent matches the Intent component
    102      * name and the Intent data. If it finds one then that task will be brought to the front and the
    103      * new Intent will be passed to onNewIntent().
    104      *
    105      * Activities launched with the NEW_DOCUMENT flag must be created with launchMode="standard".
    106      */
    107     private Intent newDocumentIntent() {
    108         final Intent newDocumentIntent = new Intent(this, NewDocumentActivity.class);
    109         newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
    110         newDocumentIntent.putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, incrementAndGet());
    111         return newDocumentIntent;
    112     }
    113 
    114     private static int incrementAndGet() {
    115         Log.d(TAG, "incrementAndGet(): " + mDocumentCounter);
    116         return mDocumentCounter++;
    117     }
    118 
    119 }
    120