blob: a4a92b6bf676a45c6a223823b702ca399fd71625 [file] [log] [blame]
/*
* 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 com.android.launcher3;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.res.XmlResourceParser;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import com.android.launcher3.AutoInstallsLayout.LayoutParserCallback;
import com.android.launcher3.LauncherSettings.Favorites;
import com.android.launcher3.backup.nano.BackupProtos.Favorite;
import com.android.launcher3.util.Thunk;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
/**
* A class that parses content values corresponding to some common app types.
*/
public class CommonAppTypeParser implements LayoutParserCallback {
private static final String TAG = "CommonAppTypeParser";
// Including TARGET_NONE
public static final int SUPPORTED_TYPE_COUNT = 7;
private static final int RESTORE_FLAG_BIT_SHIFT = 4;
private final long mItemId;
@Thunk final int mResId;
@Thunk final Context mContext;
ContentValues parsedValues;
Intent parsedIntent;
String parsedTitle;
public CommonAppTypeParser(long itemId, int itemType, Context context) {
mItemId = itemId;
mContext = context;
mResId = getResourceForItemType(itemType);
}
@Override
public long generateNewItemId() {
return mItemId;
}
@Override
public long insertAndCheck(SQLiteDatabase db, ContentValues values) {
parsedValues = values;
// Remove unwanted values
values.put(Favorites.ICON_PACKAGE, (String) null);
values.put(Favorites.ICON_RESOURCE, (String) null);
values.put(Favorites.ICON, (byte[]) null);
return 1;
}
/**
* Tries to find a suitable app to the provided app type.
*/
public boolean findDefaultApp() {
if (mResId == 0) {
return false;
}
parsedIntent = null;
parsedValues = null;
new MyLayoutParser().parseValues();
return (parsedValues != null) && (parsedIntent != null);
}
private class MyLayoutParser extends DefaultLayoutParser {
public MyLayoutParser() {
super(CommonAppTypeParser.this.mContext, null, CommonAppTypeParser.this,
CommonAppTypeParser.this.mContext.getResources(), mResId, TAG_RESOLVE);
}
@Override
protected long addShortcut(String title, Intent intent, int type) {
if (type == Favorites.ITEM_TYPE_APPLICATION) {
parsedIntent = intent;
parsedTitle = title;
}
return super.addShortcut(title, intent, type);
}
public void parseValues() {
XmlResourceParser parser = mSourceRes.getXml(mLayoutId);
try {
beginDocument(parser, mRootTag);
new ResolveParser().parseAndAdd(parser);
} catch (IOException | XmlPullParserException e) {
Log.e(TAG, "Unable to parse default app info", e);
}
parser.close();
}
}
public static int getResourceForItemType(int type) {
switch (type) {
case Favorite.TARGET_PHONE:
return R.xml.app_target_phone;
case Favorite.TARGET_MESSENGER:
return R.xml.app_target_messenger;
case Favorite.TARGET_EMAIL:
return R.xml.app_target_email;
case Favorite.TARGET_BROWSER:
return R.xml.app_target_browser;
case Favorite.TARGET_GALLERY:
return R.xml.app_target_gallery;
case Favorite.TARGET_CAMERA:
return R.xml.app_target_camera;
default:
return 0;
}
}
public static int encodeItemTypeToFlag(int itemType) {
return itemType << RESTORE_FLAG_BIT_SHIFT;
}
public static int decodeItemTypeFromFlag(int flag) {
return (flag & ShortcutInfo.FLAG_RESTORED_APP_TYPE) >> RESTORE_FLAG_BIT_SHIFT;
}
}