/*
* 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 cn.walcl.ulauncher;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import cn.walcl.ulauncher.settings.LauncherSettings;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.util.Log;
import android.view.View;
/**
* Represents an item in the launcher.
*/
public class ItemInfo {
// external apps
private static final String ANDROID_MARKET_URI_BASE = "https://market.android.com/search?q=pname:";
private static final String ANDROID_SETTINGS_PACKAGE = "com.android.settings";
private static final String ANDROID_MARKET_PACKAGE = "com.android.vending";
private static CharSequence mAppInfoLabel;
private static Drawable mMarketIcon;
private static CharSequence mMarketLabel;
// more common actions
protected static final int ACTION_DELETE = -1;
protected static final int ACTION_APPINFO = -2;
protected static final int ACTION_MARKET = -3;
protected static final int ACTION_SHARE_APP = -4;
static final int NO_ID = -1;
/**
* The id in the settings database for this item
*/
long id = NO_ID;
/**
* One of {@link LauncherSettings.Favorites#ITEM_TYPE_APPLICATION},
* {@link LauncherSettings.Favorites#ITEM_TYPE_SHORTCUT},
* {@link LauncherSettings.Favorites#ITEM_TYPE_USER_FOLDER}, or
* {@link LauncherSettings.Favorites#ITEM_TYPE_APPWIDGET}.
*/
int itemType;
/**
* The id of the container that holds this item. For the desktop, this will be
* {@link LauncherSettings.Favorites#CONTAINER_DESKTOP}. For the all applications folder it
* will be {@link #NO_ID} (since it is not stored in the settings DB). For user folders
* it will be the id of the folder.
*/
long container = NO_ID;
/**
* Iindicates the screen in which the shortcut appears.
*/
int screen = -1;
/**
* Indicates the X position of the associated cell.
*/
int cellX = -1;
/**
* Indicates the Y position of the associated cell.
*/
int cellY = -1;
/**
* Indicates the X cell span.
*/
int spanX = 1;
/**
* Indicates the Y cell span.
*/
int spanY = 1;
/**
* Indicates whether the item is a gesture.
*/
boolean isGesture = false;
ItemInfo() {
}
ItemInfo(ItemInfo info) {
id = info.id;
cellX = info.cellX;
cellY = info.cellY;
spanX = info.spanX;
spanY = info.spanY;
screen = info.screen;
itemType = info.itemType;
container = info.container;
}
/**
* Write the fields of this item to the DB
*
* @param values
*/
void onAddToDatabase(ContentValues values) {
values.put(LauncherSettings.BaseLauncherColumns.ITEM_TYPE, itemType);
if (!isGesture) {
values.put(LauncherSettings.Favorites.CONTAINER, container);
values.put(LauncherSettings.Favorites.SCREEN, screen);
values.put(LauncherSettings.Favorites.CELLX, cellX);
values.put(LauncherSettings.Favorites.CELLY, cellY);
values.put(LauncherSettings.Favorites.SPANX, spanX);
values.put(LauncherSettings.Favorites.SPANY, spanY);
}
}
static byte[] flattenBitmap(Bitmap bitmap) {
// Try go guesstimate how much space the icon will take when serialized
// to avoid unnecessary allocations/copies during the write.
int size = bitmap.getWidth() * bitmap.getHeight() * 4;
ByteArrayOutputStream out = new ByteArrayOutputStream(size);
try {
bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
out.flush();
out.close();
return out.toByteArray();
} catch (IOException e) {
Log.w("Favorite", "Could not write icon");
return null;
}
}
public static void writeBitmap(ContentValues values, Bitmap bitmap) {
if (bitmap != null) {
byte[] data = flattenBitmap(bitmap);
values.put(LauncherSettings.Favorites.ICON, data);
}
}
void unbind() {
}
@Override
public String toString() {
return "Item(id=" + this.id + " type=" + this.itemType + ")";
}
class EditAction
{
private final int mId;
private int mTitle;
private int mIcon;
private CharSequence mTitleString;
private Drawable mIconDrawable;
public EditAction(int id, int icon, int title)
{
mId = id;
mIcon = icon;
mTitle = title;
}
public EditAction(int id, int icon, CharSequence title)
{
mId = id;
mIcon = icon;
mTitleString = title;
}
public EditAction(int id, Drawable icon, CharSequence title)
{
mId = id;
mIconDrawable = icon;
mTitleString = title;
}
public int getIconResourceId()
{
return mIcon;
}
public Drawable getIconDrawable()
{
return mIconDrawable;
}
public CharSequence getTitleString()
{
return mTitleString;
}
public int getTitleResourceId()
{
return mTitle;
}
public int getId()
{
return mId;
}
}
interface ItemPackage
{
public String getPackageName(Launcher launcher);
}
public List<EditAction> getAvailableActions(View view, Launcher launcher) {
ArrayList<EditAction> result = new ArrayList<EditAction>();
if ( container != ItemInfo.NO_ID )
{
result.add(new EditAction(ACTION_DELETE,
android.R.drawable.ic_menu_delete,
R.string.menu_delete));
}
return result;
}
public void executeAction(EditAction action, View view, Launcher launcher) {
switch(action.getId()) {
case ACTION_APPINFO: {
try
{
String appPackage = ((ItemPackage) this).getPackageName(launcher);
if ( appPackage != null )
{
Intent intent = new Intent();
final int apiLevel = Build.VERSION.SDK_INT;
if (apiLevel >= 9)
{ // above 2.3
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
Uri uri = Uri.fromParts("package", appPackage, null);
intent.setData(uri);
}
else
{ // below 2.3
final String appPkgName = (apiLevel == 8 ? "pkg" : "com.android.settings.ApplicationPkgName");
intent.setAction(Intent.ACTION_VIEW);
intent.setClassName(ANDROID_SETTINGS_PACKAGE, "com.android.settings.InstalledAppDetails");
intent.putExtra(appPkgName, appPackage);
}
launcher.startActivity(intent);
}
}
catch (Exception e)
{
// failed to tell start app info
}
} break;
case ACTION_MARKET: {
try
{
String appPackage = ((ItemPackage) this).getPackageName(launcher);
if ( appPackage != null )
{
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(ANDROID_MARKET_URI_BASE + appPackage));
launcher.startActivity(intent);
}
}
catch (Exception e)
{
// failed to tell market to find the app
}
} break;
case ACTION_SHARE_APP: {
try
{
String appPackage = ((ItemPackage) this).getPackageName(launcher);
if ( appPackage != null )
{
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, ANDROID_MARKET_URI_BASE+appPackage);
;
launcher.startActivity(Intent.createChooser(intent, launcher.getString(R.string.menu_choose_share_app)));
}
}
catch (Exception e)
{
}
} break;
}
}
protected void addAppInfoAction(View view, List<EditAction> result, Launcher launcher)
{
// get the application info label and if found show the option
if (mAppInfoLabel == null)
{
try
{
Resources resources = view.getContext().createPackageContext(ANDROID_SETTINGS_PACKAGE, Context.CONTEXT_IGNORE_SECURITY).getResources();
int nameID = resources.getIdentifier("application_info_label", "string", ANDROID_SETTINGS_PACKAGE);
if (nameID != 0)
{
mAppInfoLabel = resources.getString(nameID);
}
}
catch (Exception e)
{
// can't find the settings label
}
}
if (mAppInfoLabel != null && this instanceof ItemPackage)
{
if ( ((ItemPackage) this).getPackageName(launcher) != null )
{
result.add(new EditAction(ACTION_APPINFO,
android.R.drawable.ic_menu_info_details,
mAppInfoLabel));
}
}
}
protected void addMarketActions(View view, List<EditAction> result, Launcher launcher)
{
// get the market icon and label
if (mMarketIcon == null && mMarketLabel == null)
{
try
{
PackageManager packageManager = view.getContext().getPackageManager();
android.content.pm.ApplicationInfo applicationInfo = packageManager.getApplicationInfo(ANDROID_MARKET_PACKAGE, 0);
mMarketIcon = applicationInfo.loadIcon(packageManager);
mMarketLabel = applicationInfo.loadLabel(packageManager);
if (mMarketLabel == null)
{
mMarketLabel = applicationInfo.name;
}
}
catch (Exception e)
{
// would appear there is no market
mMarketIcon = null;
mMarketLabel = "no-market";
}
}
// if market, show it as an option
if (mMarketIcon != null && mMarketLabel != null && this instanceof ItemPackage)
{
if ( ((ItemPackage) this).getPackageName(launcher) != null )
{
result.add(new EditAction(ACTION_MARKET, mMarketIcon,mMarketLabel));
result.add(new EditAction(ACTION_SHARE_APP, android.R.drawable.ic_menu_share, R.string.menu_share));
}
}
}
}