Home | History | Annotate | Download | only in app
      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 com.example.android.apis.app;
     18 
     19 import android.app.Activity;
     20 import android.content.Intent;
     21 import android.os.Bundle;
     22 import android.os.Parcelable;
     23 import android.widget.TextView;
     24 
     25 import com.example.android.apis.R;
     26 
     27 /**
     28  * This Activity actually handles two stages of a launcher shortcut's life cycle.
     29  *
     30  * 1. Your application offers to provide shortcuts to the launcher.  When
     31  *    the user installs a shortcut, an activity within your application
     32  *    generates the actual shortcut and returns it to the launcher, where it
     33  *    is shown to the user as an icon.
     34  *
     35  * 2. Any time the user clicks on an installed shortcut, an intent is sent.
     36  *    Typically this would then be handled as necessary by an activity within
     37  *    your application.
     38  *
     39  * We handle stage 1 (creating a shortcut) by simply sending back the information (in the form
     40  * of an {@link android.content.Intent} that the launcher will use to create the shortcut.
     41  *
     42  * You can also implement this in an interactive way, by having your activity actually present
     43  * UI for the user to select the specific nature of the shortcut, such as a contact, picture, URL,
     44  * media item, or action.
     45  *
     46  * We handle stage 2 (responding to a shortcut) in this sample by simply displaying the contents
     47  * of the incoming {@link android.content.Intent}.
     48  *
     49  * In a real application, you would probably use the shortcut intent to display specific content
     50  * or start a particular operation.
     51  */
     52 public class LauncherShortcuts extends Activity {
     53 
     54     private static final String EXTRA_KEY = "com.example.android.apis.app.LauncherShortcuts";
     55 
     56     @Override
     57     public void onCreate(Bundle icicle) {
     58         super.onCreate(icicle);
     59 
     60         // Resolve the intent
     61 
     62         final Intent intent = getIntent();
     63         final String action = intent.getAction();
     64 
     65         // If the intent is a request to create a shortcut, we'll do that and exit
     66 
     67         if (Intent.ACTION_CREATE_SHORTCUT.equals(action)) {
     68             setupShortcut();
     69             finish();
     70             return;
     71         }
     72 
     73         // If we weren't launched with a CREATE_SHORTCUT intent, simply put up an informative
     74         // display.
     75 
     76         // Inflate our UI from its XML layout description.
     77 
     78         setContentView(R.layout.launcher_shortcuts);
     79 
     80         // Provide a lightweight view of the Intent that launched us
     81 
     82         TextView intentInfo = (TextView) findViewById(R.id.txt_shortcut_intent);
     83         String info = intent.toString();
     84         String extra = intent.getStringExtra(EXTRA_KEY);
     85         if (extra != null) {
     86             info = info + " " + extra;
     87         }
     88         intentInfo.setText(info);
     89     }
     90 
     91     /**
     92      * This function creates a shortcut and returns it to the caller.  There are actually two
     93      * intents that you will send back.
     94      *
     95      * The first intent serves as a container for the shortcut and is returned to the launcher by
     96      * setResult().  This intent must contain three fields:
     97      *
     98      * <ul>
     99      * <li>{@link android.content.Intent#EXTRA_SHORTCUT_INTENT} The shortcut intent.</li>
    100      * <li>{@link android.content.Intent#EXTRA_SHORTCUT_NAME} The text that will be displayed with
    101      * the shortcut.</li>
    102      * <li>{@link android.content.Intent#EXTRA_SHORTCUT_ICON} The shortcut's icon, if provided as a
    103      * bitmap, <i>or</i> {@link android.content.Intent#EXTRA_SHORTCUT_ICON_RESOURCE} if provided as
    104      * a drawable resource.</li>
    105      * </ul>
    106      *
    107      * If you use a simple drawable resource, note that you must wrapper it using
    108      * {@link android.content.Intent.ShortcutIconResource}, as shown below.  This is required so
    109      * that the launcher can access resources that are stored in your application's .apk file.  If
    110      * you return a bitmap, such as a thumbnail, you can simply put the bitmap into the extras
    111      * bundle using {@link android.content.Intent#EXTRA_SHORTCUT_ICON}.
    112      *
    113      * The shortcut intent can be any intent that you wish the launcher to send, when the user
    114      * clicks on the shortcut.  Typically this will be {@link android.content.Intent#ACTION_VIEW}
    115      * with an appropriate Uri for your content, but any Intent will work here as long as it
    116      * triggers the desired action within your Activity.
    117      */
    118     private void setupShortcut() {
    119         // First, set up the shortcut intent.  For this example, we simply create an intent that
    120         // will bring us directly back to this activity.  A more typical implementation would use a
    121         // data Uri in order to display a more specific result, or a custom action in order to
    122         // launch a specific operation.
    123 
    124         Intent shortcutIntent = new Intent(Intent.ACTION_MAIN);
    125         shortcutIntent.setClassName(this, this.getClass().getName());
    126         shortcutIntent.putExtra(EXTRA_KEY, "ApiDemos Provided This Shortcut");
    127 
    128         // Then, set up the container intent (the response to the caller)
    129 
    130         Intent intent = new Intent();
    131         intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
    132         intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.shortcut_name));
    133         Parcelable iconResource = Intent.ShortcutIconResource.fromContext(
    134                 this,  R.drawable.app_sample_code);
    135         intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);
    136 
    137         // Now, return the result to the launcher
    138 
    139         setResult(RESULT_OK, intent);
    140     }
    141 }
    142