/*
 * Copyright (C) 2008 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.provider;

import android.annotation.SdkConstant;

/**
 * <p>A LiveFolder is a special folder whose content is provided by a
 * {@link android.content.ContentProvider}. To create a live folder, two components
 * are required:</p>
 * <ul>
 *  <li>An activity that can respond to the intent action {@link #ACTION_CREATE_LIVE_FOLDER}. The
 *  activity is responsible for creating the live folder.</li>
 *  <li>A {@link android.content.ContentProvider} to provide the live folder items.</li>
 * </ul>
 *
 * <h3>Lifecycle</h3>
 * <p>When a user wants to create a live folder, the system looks for all activities with the
 * intent filter action {@link #ACTION_CREATE_LIVE_FOLDER} and presents the list to the user.
 * When the user chooses one of the activities, the activity is invoked with the
 * {@link #ACTION_CREATE_LIVE_FOLDER} action. The activity then creates the live folder and
 * passes it back to the system by setting it as an
 * {@link android.app.Activity#setResult(int, android.content.Intent) activity result}. The
 * live folder is described by a content provider URI, a name, an icon and a display mode.
 * Finally, when the user opens the live folder, the system queries the content provider
 * to retrieve the folder's content.</p>
 *
 * <h3>Setting up the live folder activity</h3>
 * <p>The following code sample shows how to write an activity that creates a live folder:</p>
 * <pre>
 * public static class MyLiveFolder extends Activity {
 *     public static final Uri CONTENT_URI = Uri.parse("content://my.app/live");
 *
 *     protected void onCreate(Bundle savedInstanceState) {
 *         super.onCreate(savedInstanceState);
 *
 *         final Intent intent = getIntent();
 *         final String action = intent.getAction();
 *
 *         if (LiveFolders.ACTION_CREATE_LIVE_FOLDER.equals(action)) {
 *             setResult(RESULT_OK, createLiveFolder(this, CONTENT_URI, "My LiveFolder",
 *                     R.drawable.ic_launcher_contacts_phones));
 *         } else {
 *             setResult(RESULT_CANCELED);
 *         }
 *
 *         finish();
 *     }
 *
 *     private static Intent createLiveFolder(Context context, Uri uri, String name,
 *             int icon) {
 *
 *         final Intent intent = new Intent();
 *
 *         intent.setData(uri);
 *         intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_NAME, name);
 *         intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_ICON,
 *                 Intent.ShortcutIconResource.fromContext(context, icon));
 *         intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_DISPLAY_MODE, LiveFolders.DISPLAY_MODE_LIST);
 *
 *         return intent;
 *     }
 * }
 * </pre>
 * <p>The live folder is described by an {@link android.content.Intent} as follows:</p>
 * <table border="2" width="85%" align="center" frame="hsides" rules="rows">
 *     <thead>
 *     <tr><th>Component</th> <th>Type</th> <th>Description</th> <th>Required</th></tr>
 *     </thead>
 *
 *     <tbody>
 *     <tr><th>URI</th>
 *         <td>URI</td>
 *         <td>The ContentProvider URI</td>
 *         <td align="center">Yes</td>
 *     </tr>
 *     <tr><th>{@link #EXTRA_LIVE_FOLDER_NAME}</th>
 *         <td>Extra String</td>
 *         <td>The name of the live folder</td>
 *         <td align="center">Yes</td>
 *     </tr>
 *     <tr><th>{@link #EXTRA_LIVE_FOLDER_ICON}</th>
 *         <td>Extra {@link android.content.Intent.ShortcutIconResource}</td>
 *         <td>The icon of the live folder</td>
 *         <td align="center">Yes</td>
 *     </tr>
 *     <tr><th>{@link #EXTRA_LIVE_FOLDER_DISPLAY_MODE}</th>
 *         <td>Extra int</td>
 *         <td>The display mode of the live folder. The value must be either
 *         {@link #DISPLAY_MODE_GRID} or {@link #DISPLAY_MODE_LIST}.</td>
 *         <td align="center">Yes</td>
 *     </tr>
 *     <tr><th>{@link #EXTRA_LIVE_FOLDER_BASE_INTENT}</th>
 *         <td>Extra Intent</td>
 *         <td>When the user clicks an item inside a live folder, the system will either fire
 *         the intent associated with that item or, if present, the live folder's base intent
 *         with the id of the item appended to the base intent's URI.</td>
 *         <td align="center">No</td>
 *     </tr>
 *     </tbody>
 * </table>
 *
 * <h3>Setting up the content provider</h3>
 * <p>The live folder's content provider must, upon query, return a {@link android.database.Cursor}
 * whose columns match the following names:</p>
 * <table border="2" width="85%" align="center" frame="hsides" rules="rows">
 *     <thead>
 *     <tr><th>Column</th> <th>Type</th> <th>Description</th> <th>Required</th></tr>
 *     </thead>
 *
 *     <tbody>
 *     <tr><th>{@link #NAME}</th>
 *         <td>String</td>
 *         <td>The name of the item</td>
 *         <td align="center">Yes</td>
 *     </tr>
 *     <tr><th>{@link #DESCRIPTION}</th>
 *         <td>String</td>
 *         <td>The description of the item. The description is ignored when the live folder's
 *         display mode is {@link #DISPLAY_MODE_GRID}.</td>
 *         <td align="center">No</td>
 *     </tr>
 *     <tr><th>{@link #INTENT}</th>
 *         <td>{@link android.content.Intent}</td>
 *         <td>The intent to fire when the item is clicked. Ignored when the live folder defines
 *         a base intent.</td>
 *         <td align="center">No</td>
 *     </tr>
 *     <tr><th>{@link #ICON_BITMAP}</th>
 *         <td>Bitmap</td>
 *         <td>The icon for the item. When this column value is not null, the values for the
 *         columns {@link #ICON_PACKAGE} and {@link #ICON_RESOURCE} must be null.</td>
 *         <td align="center">No</td>
 *     </tr>
 *     <tr><th>{@link #ICON_PACKAGE}</th>
 *         <td>String</td>
 *         <td>The package of the item's icon. When this value is not null, the value for the
 *         column {@link #ICON_RESOURCE} must be specified and the value for the column
 *         {@link #ICON_BITMAP} must be null.</td>
 *         <td align="center">No</td>
 *     </tr>
 *     <tr><th>{@link #ICON_RESOURCE}</th>
 *         <td>String</td>
 *         <td>The resource name of the item's icon. When this value is not null, the value for the
 *         column {@link #ICON_PACKAGE} must be specified and the value for the column
 *         {@link #ICON_BITMAP} must be null.</td>
 *         <td align="center">No</td>
 *     </tr>
 *     </tbody>
 * </table>
 * 
 * @deprecated Live folders are no longer supported by Android.  These have been
 * replaced by the new
 * <a href="{@docRoot}guide/topics/appwidgets/index.html#collections">AppWidget Collection</a>
 * APIs introduced in {@link android.os.Build.VERSION_CODES#HONEYCOMB}.  These provide
 * all of the features of live folders plus many more.  The use of live folders is greatly
 * discouraged because of security issues they introduce -- publishing a live folder requires
 * making all data show for the live folder available to all applications with no
 * permissions protecting it.
 */
@Deprecated
public final class LiveFolders implements BaseColumns {
    /**
     * <p>Content provider column.</p>
     * <p>Name of the live folder item.</p>
     * <p>Required.</p>
     * <p>Type: String.</p>
     */
    public static final String NAME = "name";

    /**
     * <p>Content provider column.</p>
     * <p>Description of the live folder item. This value is ignored if the
     * live folder's display mode is {@link LiveFolders#DISPLAY_MODE_GRID}.</p>
     * <p>Optional.</p>
     * <p>Type: String.</p>
     *
     * @see LiveFolders#EXTRA_LIVE_FOLDER_DISPLAY_MODE
     */
    public static final String DESCRIPTION = "description";

    /**
     * <p>Content provider column.</p>
     * <p>Intent of the live folder item.</p>
     * <p>Optional if the live folder has a base intent.</p>
     * <p>Type: {@link android.content.Intent}.</p>
     *
     * @see LiveFolders#EXTRA_LIVE_FOLDER_BASE_INTENT
     */
    public static final String INTENT = "intent";

    /**
     * <p>Content provider column.</p>
     * <p>Icon of the live folder item, as a custom bitmap.</p>
     * <p>Optional.</p>
     * <p>Type: {@link android.graphics.Bitmap}.</p>
     */
    public static final String ICON_BITMAP = "icon_bitmap";

    /**
     * <p>Content provider column.</p>
     * <p>Package where to find the icon of the live folder item. This value can be
     * obtained easily using
     * {@link android.content.Intent.ShortcutIconResource#fromContext(android.content.Context, int)}.</p>
     * <p>Optional.</p>
     * <p>Type: String.</p>
     *
     * @see #ICON_RESOURCE
     * @see android.content.Intent.ShortcutIconResource
     */
    public static final String ICON_PACKAGE = "icon_package";

    /**
     * <p>Content provider column.</p>
     * <p>Resource name of the live folder item. This value can be obtained easily using
     * {@link android.content.Intent.ShortcutIconResource#fromContext(android.content.Context, int)}.</p>
     * <p>Optional.</p>
     * <p>Type: String.</p>
     *
     * @see #ICON_PACKAGE
     * @see android.content.Intent.ShortcutIconResource
     */
    public static final String ICON_RESOURCE = "icon_resource";

    /**
     * Displays a live folder's content in a grid.
     *
     * @see LiveFolders#EXTRA_LIVE_FOLDER_DISPLAY_MODE
     */
    public static final int DISPLAY_MODE_GRID = 0x1;

    /**
     * Displays a live folder's content in a list.
     *
     * @see LiveFolders#EXTRA_LIVE_FOLDER_DISPLAY_MODE
     */
    public static final int DISPLAY_MODE_LIST = 0x2;

    /**
     * The name of the extra used to define the name of a live folder.
     *
     * @see #ACTION_CREATE_LIVE_FOLDER
     */
    public static final String EXTRA_LIVE_FOLDER_NAME = "android.intent.extra.livefolder.NAME";

    /**
     * The name of the extra used to define the icon of a live folder.
     *
     * @see #ACTION_CREATE_LIVE_FOLDER
     */
    public static final String EXTRA_LIVE_FOLDER_ICON = "android.intent.extra.livefolder.ICON";

    /**
     * The name of the extra used to define the display mode of a live folder.
     *
     * @see #ACTION_CREATE_LIVE_FOLDER
     * @see #DISPLAY_MODE_GRID
     * @see #DISPLAY_MODE_LIST
     */
    public static final String EXTRA_LIVE_FOLDER_DISPLAY_MODE =
            "android.intent.extra.livefolder.DISPLAY_MODE";

    /**
     * The name of the extra used to define the base Intent of a live folder.
     *
     * @see #ACTION_CREATE_LIVE_FOLDER
     */
    public static final String EXTRA_LIVE_FOLDER_BASE_INTENT =
            "android.intent.extra.livefolder.BASE_INTENT";

    /**
     * Activity Action: Creates a live folder.
     * <p>Input: Nothing.</p>
     * <p>Output: An Intent representing the live folder. The intent must contain four
     * extras: EXTRA_LIVE_FOLDER_NAME (value: String),
     * EXTRA_LIVE_FOLDER_ICON (value: ShortcutIconResource),
     * EXTRA_LIVE_FOLDER_URI (value: String) and
     * EXTRA_LIVE_FOLDER_DISPLAY_MODE (value: int). The Intent can optionnally contain
     * EXTRA_LIVE_FOLDER_BASE_INTENT (value: Intent).</p>
     *
     * @see #EXTRA_LIVE_FOLDER_NAME
     * @see #EXTRA_LIVE_FOLDER_ICON
     * @see #EXTRA_LIVE_FOLDER_DISPLAY_MODE
     * @see #EXTRA_LIVE_FOLDER_BASE_INTENT
     * @see android.content.Intent.ShortcutIconResource
     */
    @SdkConstant(SdkConstant.SdkConstantType.ACTIVITY_INTENT_ACTION)
    public static final String ACTION_CREATE_LIVE_FOLDER =
            "android.intent.action.CREATE_LIVE_FOLDER";

    private LiveFolders() {
    }
}
