Merge "Refactoring wallpaper picker activity" into ub-launcher3-master
This commit is contained in:
@@ -1,203 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2010 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.app.WallpaperInfo;
|
||||
import android.app.WallpaperManager;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.AsyncTask;
|
||||
import android.service.wallpaper.WallpaperService;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.ListAdapter;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.android.launcher3.util.Thunk;
|
||||
|
||||
import org.xmlpull.v1.XmlPullParserException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.text.Collator;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
public class LiveWallpaperListAdapter extends BaseAdapter implements ListAdapter {
|
||||
private static final String LOG_TAG = "LiveWallpaperListAdapter";
|
||||
|
||||
private final LayoutInflater mInflater;
|
||||
private final PackageManager mPackageManager;
|
||||
|
||||
@Thunk List<LiveWallpaperTile> mWallpapers;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public LiveWallpaperListAdapter(Context context) {
|
||||
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
||||
mPackageManager = context.getPackageManager();
|
||||
|
||||
List<ResolveInfo> list = mPackageManager.queryIntentServices(
|
||||
new Intent(WallpaperService.SERVICE_INTERFACE),
|
||||
PackageManager.GET_META_DATA);
|
||||
|
||||
mWallpapers = new ArrayList<LiveWallpaperTile>();
|
||||
|
||||
new LiveWallpaperEnumerator(context).execute(list);
|
||||
}
|
||||
|
||||
public int getCount() {
|
||||
if (mWallpapers == null) {
|
||||
return 0;
|
||||
}
|
||||
return mWallpapers.size();
|
||||
}
|
||||
|
||||
public LiveWallpaperTile getItem(int position) {
|
||||
return mWallpapers.get(position);
|
||||
}
|
||||
|
||||
public long getItemId(int position) {
|
||||
return position;
|
||||
}
|
||||
|
||||
public View getView(int position, View convertView, ViewGroup parent) {
|
||||
View view;
|
||||
|
||||
if (convertView == null) {
|
||||
view = mInflater.inflate(R.layout.wallpaper_picker_live_wallpaper_item, parent, false);
|
||||
} else {
|
||||
view = convertView;
|
||||
}
|
||||
|
||||
LiveWallpaperTile wallpaperInfo = mWallpapers.get(position);
|
||||
wallpaperInfo.setView(view);
|
||||
ImageView image = (ImageView) view.findViewById(R.id.wallpaper_image);
|
||||
ImageView icon = (ImageView) view.findViewById(R.id.wallpaper_icon);
|
||||
if (wallpaperInfo.mThumbnail != null) {
|
||||
image.setImageDrawable(wallpaperInfo.mThumbnail);
|
||||
icon.setVisibility(View.GONE);
|
||||
} else {
|
||||
icon.setImageDrawable(wallpaperInfo.mInfo.loadIcon(mPackageManager));
|
||||
icon.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
TextView label = (TextView) view.findViewById(R.id.wallpaper_item_label);
|
||||
label.setText(wallpaperInfo.mInfo.loadLabel(mPackageManager));
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
public static class LiveWallpaperTile extends WallpaperPickerActivity.WallpaperTileInfo {
|
||||
@Thunk Drawable mThumbnail;
|
||||
@Thunk WallpaperInfo mInfo;
|
||||
public LiveWallpaperTile(Drawable thumbnail, WallpaperInfo info, Intent intent) {
|
||||
mThumbnail = thumbnail;
|
||||
mInfo = info;
|
||||
}
|
||||
@Override
|
||||
public void onClick(WallpaperPickerActivity a) {
|
||||
Intent preview = new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER);
|
||||
preview.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT,
|
||||
mInfo.getComponent());
|
||||
a.startActivityForResultSafely(preview,
|
||||
WallpaperPickerActivity.PICK_WALLPAPER_THIRD_PARTY_ACTIVITY);
|
||||
}
|
||||
}
|
||||
|
||||
private class LiveWallpaperEnumerator extends
|
||||
AsyncTask<List<ResolveInfo>, LiveWallpaperTile, Void> {
|
||||
private Context mContext;
|
||||
private int mWallpaperPosition;
|
||||
|
||||
public LiveWallpaperEnumerator(Context context) {
|
||||
super();
|
||||
mContext = context;
|
||||
mWallpaperPosition = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Void doInBackground(List<ResolveInfo>... params) {
|
||||
final PackageManager packageManager = mContext.getPackageManager();
|
||||
|
||||
List<ResolveInfo> list = params[0];
|
||||
|
||||
Collections.sort(list, new Comparator<ResolveInfo>() {
|
||||
final Collator mCollator;
|
||||
|
||||
{
|
||||
mCollator = Collator.getInstance();
|
||||
}
|
||||
|
||||
public int compare(ResolveInfo info1, ResolveInfo info2) {
|
||||
return mCollator.compare(info1.loadLabel(packageManager),
|
||||
info2.loadLabel(packageManager));
|
||||
}
|
||||
});
|
||||
|
||||
for (ResolveInfo resolveInfo : list) {
|
||||
WallpaperInfo info = null;
|
||||
try {
|
||||
info = new WallpaperInfo(mContext, resolveInfo);
|
||||
} catch (XmlPullParserException e) {
|
||||
Log.w(LOG_TAG, "Skipping wallpaper " + resolveInfo.serviceInfo, e);
|
||||
continue;
|
||||
} catch (IOException e) {
|
||||
Log.w(LOG_TAG, "Skipping wallpaper " + resolveInfo.serviceInfo, e);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
Drawable thumb = info.loadThumbnail(packageManager);
|
||||
Intent launchIntent = new Intent(WallpaperService.SERVICE_INTERFACE);
|
||||
launchIntent.setClassName(info.getPackageName(), info.getServiceName());
|
||||
LiveWallpaperTile wallpaper = new LiveWallpaperTile(thumb, info, launchIntent);
|
||||
publishProgress(wallpaper);
|
||||
}
|
||||
// Send a null object to show loading is finished
|
||||
publishProgress((LiveWallpaperTile) null);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onProgressUpdate(LiveWallpaperTile...infos) {
|
||||
for (LiveWallpaperTile info : infos) {
|
||||
if (info == null) {
|
||||
LiveWallpaperListAdapter.this.notifyDataSetChanged();
|
||||
break;
|
||||
}
|
||||
if (info.mThumbnail != null) {
|
||||
info.mThumbnail.setDither(true);
|
||||
}
|
||||
if (mWallpaperPosition < mWallpapers.size()) {
|
||||
mWallpapers.set(mWallpaperPosition, info);
|
||||
} else {
|
||||
mWallpapers.add(info);
|
||||
}
|
||||
mWallpaperPosition++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -26,29 +26,24 @@ import android.graphics.BitmapFactory;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.util.Log;
|
||||
import android.util.Pair;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.widget.ListAdapter;
|
||||
|
||||
import com.android.launcher3.wallpapertileinfo.FileWallpaperInfo;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class SavedWallpaperImages {
|
||||
|
||||
public class SavedWallpaperImages extends BaseAdapter implements ListAdapter {
|
||||
private static String TAG = "Launcher3.SavedWallpaperImages";
|
||||
private ImageDb mDb;
|
||||
ArrayList<SavedWallpaperTile> mImages;
|
||||
Context mContext;
|
||||
LayoutInflater mLayoutInflater;
|
||||
|
||||
public static class SavedWallpaperTile extends WallpaperPickerActivity.FileWallpaperInfo {
|
||||
public static class SavedWallpaperInfo extends FileWallpaperInfo {
|
||||
|
||||
private int mDbId;
|
||||
public SavedWallpaperTile(int dbId, File target, Drawable thumb) {
|
||||
|
||||
public SavedWallpaperInfo(int dbId, File target, Drawable thumb) {
|
||||
super(target, thumb);
|
||||
mDbId = dbId;
|
||||
}
|
||||
@@ -59,19 +54,22 @@ public class SavedWallpaperImages extends BaseAdapter implements ListAdapter {
|
||||
}
|
||||
}
|
||||
|
||||
private final ImageDb mDb;
|
||||
private final Context mContext;
|
||||
|
||||
public SavedWallpaperImages(Context context) {
|
||||
// We used to store the saved images in the cache directory, but that meant they'd get
|
||||
// deleted sometimes-- move them to the data directory
|
||||
ImageDb.moveFromCacheDirectoryIfNecessary(context);
|
||||
mDb = new ImageDb(context);
|
||||
mContext = context;
|
||||
mLayoutInflater = LayoutInflater.from(context);
|
||||
}
|
||||
|
||||
public void loadThumbnailsAndImageIdList() {
|
||||
mImages = new ArrayList<SavedWallpaperTile>();
|
||||
public List<SavedWallpaperInfo> loadThumbnailsAndImageIdList() {
|
||||
List<SavedWallpaperInfo> result = new ArrayList<SavedWallpaperInfo>();
|
||||
|
||||
SQLiteDatabase db = mDb.getReadableDatabase();
|
||||
Cursor result = db.query(ImageDb.TABLE_NAME,
|
||||
Cursor c = db.query(ImageDb.TABLE_NAME,
|
||||
new String[] { ImageDb.COLUMN_ID,
|
||||
ImageDb.COLUMN_IMAGE_THUMBNAIL_FILENAME,
|
||||
ImageDb.COLUMN_IMAGE_FILENAME}, // cols to return
|
||||
@@ -82,43 +80,24 @@ public class SavedWallpaperImages extends BaseAdapter implements ListAdapter {
|
||||
ImageDb.COLUMN_ID + " DESC",
|
||||
null);
|
||||
|
||||
while (result.moveToNext()) {
|
||||
String filename = result.getString(1);
|
||||
while (c.moveToNext()) {
|
||||
String filename = c.getString(1);
|
||||
File file = new File(mContext.getFilesDir(), filename);
|
||||
|
||||
Bitmap thumb = BitmapFactory.decodeFile(file.getAbsolutePath());
|
||||
if (thumb != null) {
|
||||
mImages.add(new SavedWallpaperTile(result.getInt(0),
|
||||
new File(mContext.getFilesDir(), result.getString(2)),
|
||||
new BitmapDrawable(thumb)));
|
||||
result.add(new SavedWallpaperInfo(c.getInt(0),
|
||||
new File(mContext.getFilesDir(), c.getString(2)),
|
||||
new BitmapDrawable(mContext.getResources(), thumb)));
|
||||
}
|
||||
}
|
||||
result.close();
|
||||
c.close();
|
||||
return result;
|
||||
}
|
||||
|
||||
public int getCount() {
|
||||
return mImages.size();
|
||||
}
|
||||
public void deleteImage(int id) {
|
||||
SQLiteDatabase db = mDb.getWritableDatabase();
|
||||
|
||||
public SavedWallpaperTile getItem(int position) {
|
||||
return mImages.get(position);
|
||||
}
|
||||
|
||||
public long getItemId(int position) {
|
||||
return position;
|
||||
}
|
||||
|
||||
public View getView(int position, View convertView, ViewGroup parent) {
|
||||
Drawable thumbDrawable = mImages.get(position).mThumb;
|
||||
if (thumbDrawable == null) {
|
||||
Log.e(TAG, "Error decoding thumbnail for wallpaper #" + position);
|
||||
}
|
||||
return WallpaperPickerActivity.createImageTileView(
|
||||
mLayoutInflater, convertView, parent, thumbDrawable);
|
||||
}
|
||||
|
||||
private Pair<String, String> getImageFilenames(int id) {
|
||||
SQLiteDatabase db = mDb.getReadableDatabase();
|
||||
Cursor result = db.query(ImageDb.TABLE_NAME,
|
||||
new String[] { ImageDb.COLUMN_IMAGE_THUMBNAIL_FILENAME,
|
||||
ImageDb.COLUMN_IMAGE_FILENAME }, // cols to return
|
||||
@@ -128,24 +107,12 @@ public class SavedWallpaperImages extends BaseAdapter implements ListAdapter {
|
||||
null,
|
||||
null,
|
||||
null);
|
||||
if (result.getCount() > 0) {
|
||||
result.moveToFirst();
|
||||
String thumbFilename = result.getString(0);
|
||||
String imageFilename = result.getString(1);
|
||||
result.close();
|
||||
return new Pair<String, String>(thumbFilename, imageFilename);
|
||||
} else {
|
||||
return null;
|
||||
if (result.moveToFirst()) {
|
||||
new File(mContext.getFilesDir(), result.getString(0)).delete();
|
||||
new File(mContext.getFilesDir(), result.getString(1)).delete();
|
||||
}
|
||||
}
|
||||
result.close();
|
||||
|
||||
public void deleteImage(int id) {
|
||||
Pair<String, String> filenames = getImageFilenames(id);
|
||||
File imageFile = new File(mContext.getFilesDir(), filenames.first);
|
||||
imageFile.delete();
|
||||
File thumbFile = new File(mContext.getFilesDir(), filenames.second);
|
||||
thumbFile.delete();
|
||||
SQLiteDatabase db = mDb.getWritableDatabase();
|
||||
db.delete(ImageDb.TABLE_NAME,
|
||||
ImageDb.COLUMN_ID + " = ?", // SELECT query
|
||||
new String[] {
|
||||
@@ -177,20 +144,16 @@ public class SavedWallpaperImages extends BaseAdapter implements ListAdapter {
|
||||
}
|
||||
}
|
||||
|
||||
static class ImageDb extends SQLiteOpenHelper {
|
||||
private static class ImageDb extends SQLiteOpenHelper {
|
||||
final static int DB_VERSION = 1;
|
||||
final static String TABLE_NAME = "saved_wallpaper_images";
|
||||
final static String COLUMN_ID = "id";
|
||||
final static String COLUMN_IMAGE_THUMBNAIL_FILENAME = "image_thumbnail";
|
||||
final static String COLUMN_IMAGE_FILENAME = "image";
|
||||
|
||||
Context mContext;
|
||||
|
||||
public ImageDb(Context context) {
|
||||
super(context, context.getDatabasePath(LauncherFiles.WALLPAPER_IMAGES_DB).getPath(),
|
||||
null, DB_VERSION);
|
||||
// Store the context for later use
|
||||
mContext = context;
|
||||
}
|
||||
|
||||
public static void moveFromCacheDirectoryIfNecessary(Context context) {
|
||||
|
||||
@@ -1,136 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2010 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.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.widget.ListAdapter;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.android.launcher3.util.Thunk;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ThirdPartyWallpaperPickerListAdapter extends BaseAdapter implements ListAdapter {
|
||||
private final LayoutInflater mInflater;
|
||||
private final PackageManager mPackageManager;
|
||||
private final int mIconSize;
|
||||
|
||||
private List<ThirdPartyWallpaperTile> mThirdPartyWallpaperPickers =
|
||||
new ArrayList<ThirdPartyWallpaperTile>();
|
||||
|
||||
public static class ThirdPartyWallpaperTile extends WallpaperPickerActivity.WallpaperTileInfo {
|
||||
@Thunk ResolveInfo mResolveInfo;
|
||||
public ThirdPartyWallpaperTile(ResolveInfo resolveInfo) {
|
||||
mResolveInfo = resolveInfo;
|
||||
}
|
||||
@Override
|
||||
public void onClick(WallpaperPickerActivity a) {
|
||||
final ComponentName itemComponentName = new ComponentName(
|
||||
mResolveInfo.activityInfo.packageName, mResolveInfo.activityInfo.name);
|
||||
Intent launchIntent = new Intent(Intent.ACTION_SET_WALLPAPER);
|
||||
launchIntent.setComponent(itemComponentName);
|
||||
a.startActivityForResultSafely(
|
||||
launchIntent, WallpaperPickerActivity.PICK_WALLPAPER_THIRD_PARTY_ACTIVITY);
|
||||
}
|
||||
}
|
||||
|
||||
public ThirdPartyWallpaperPickerListAdapter(Context context) {
|
||||
mInflater = LayoutInflater.from(context);
|
||||
mPackageManager = context.getPackageManager();
|
||||
mIconSize = context.getResources().getDimensionPixelSize(R.dimen.wallpaperItemIconSize);
|
||||
final PackageManager pm = mPackageManager;
|
||||
|
||||
final Intent pickWallpaperIntent = new Intent(Intent.ACTION_SET_WALLPAPER);
|
||||
final List<ResolveInfo> apps =
|
||||
pm.queryIntentActivities(pickWallpaperIntent, 0);
|
||||
|
||||
// Get list of image picker intents
|
||||
Intent pickImageIntent = new Intent(Intent.ACTION_GET_CONTENT);
|
||||
pickImageIntent.setType("image/*");
|
||||
final List<ResolveInfo> imagePickerActivities =
|
||||
pm.queryIntentActivities(pickImageIntent, 0);
|
||||
final ComponentName[] imageActivities = new ComponentName[imagePickerActivities.size()];
|
||||
for (int i = 0; i < imagePickerActivities.size(); i++) {
|
||||
ActivityInfo activityInfo = imagePickerActivities.get(i).activityInfo;
|
||||
imageActivities[i] = new ComponentName(activityInfo.packageName, activityInfo.name);
|
||||
}
|
||||
|
||||
outerLoop:
|
||||
for (ResolveInfo info : apps) {
|
||||
final ComponentName itemComponentName =
|
||||
new ComponentName(info.activityInfo.packageName, info.activityInfo.name);
|
||||
final String itemPackageName = itemComponentName.getPackageName();
|
||||
// Exclude anything from our own package, and the old Launcher,
|
||||
// and live wallpaper picker
|
||||
if (itemPackageName.equals(context.getPackageName()) ||
|
||||
itemPackageName.equals("com.android.launcher") ||
|
||||
itemPackageName.equals("com.android.wallpaper.livepicker")) {
|
||||
continue;
|
||||
}
|
||||
// Exclude any package that already responds to the image picker intent
|
||||
for (ResolveInfo imagePickerActivityInfo : imagePickerActivities) {
|
||||
if (itemPackageName.equals(
|
||||
imagePickerActivityInfo.activityInfo.packageName)) {
|
||||
continue outerLoop;
|
||||
}
|
||||
}
|
||||
mThirdPartyWallpaperPickers.add(new ThirdPartyWallpaperTile(info));
|
||||
}
|
||||
}
|
||||
|
||||
public int getCount() {
|
||||
return mThirdPartyWallpaperPickers.size();
|
||||
}
|
||||
|
||||
public ThirdPartyWallpaperTile getItem(int position) {
|
||||
return mThirdPartyWallpaperPickers.get(position);
|
||||
}
|
||||
|
||||
public long getItemId(int position) {
|
||||
return position;
|
||||
}
|
||||
|
||||
public View getView(int position, View convertView, ViewGroup parent) {
|
||||
View view;
|
||||
|
||||
if (convertView == null) {
|
||||
view = mInflater.inflate(R.layout.wallpaper_picker_third_party_item, parent, false);
|
||||
} else {
|
||||
view = convertView;
|
||||
}
|
||||
|
||||
ResolveInfo info = mThirdPartyWallpaperPickers.get(position).mResolveInfo;
|
||||
TextView label = (TextView) view.findViewById(R.id.wallpaper_item_label);
|
||||
label.setText(info.loadLabel(mPackageManager));
|
||||
Drawable icon = info.loadIcon(mPackageManager);
|
||||
icon.setBounds(new Rect(0, 0, mIconSize, mIconSize));
|
||||
label.setCompoundDrawables(null, icon, null, null);
|
||||
return view;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
package com.android.launcher3;
|
||||
|
||||
import android.view.View;
|
||||
import android.view.ViewPropertyAnimator;
|
||||
import android.view.animation.AccelerateInterpolator;
|
||||
import android.view.animation.DecelerateInterpolator;
|
||||
|
||||
import com.android.launcher3.util.Thunk;
|
||||
|
||||
/**
|
||||
* Callback that toggles the visibility of the target view when crop view is tapped.
|
||||
*/
|
||||
public class ToggleOnTapCallback implements CropView.TouchCallback {
|
||||
|
||||
@Thunk final View mViewtoToggle;
|
||||
|
||||
private ViewPropertyAnimator mAnim;
|
||||
private boolean mIgnoreNextTap;
|
||||
|
||||
public ToggleOnTapCallback(View viewtoHide) {
|
||||
mViewtoToggle = viewtoHide;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTouchDown() {
|
||||
if (mAnim != null) {
|
||||
mAnim.cancel();
|
||||
}
|
||||
if (mViewtoToggle.getAlpha() == 1f) {
|
||||
mIgnoreNextTap = true;
|
||||
}
|
||||
|
||||
mAnim = mViewtoToggle.animate();
|
||||
mAnim.alpha(0f)
|
||||
.setDuration(150)
|
||||
.withEndAction(new Runnable() {
|
||||
public void run() {
|
||||
mViewtoToggle.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
});
|
||||
|
||||
mAnim.setInterpolator(new AccelerateInterpolator(0.75f));
|
||||
mAnim.start();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTouchUp() {
|
||||
mIgnoreNextTap = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTap() {
|
||||
boolean ignoreTap = mIgnoreNextTap;
|
||||
mIgnoreNextTap = false;
|
||||
if (!ignoreTap) {
|
||||
if (mAnim != null) {
|
||||
mAnim.cancel();
|
||||
}
|
||||
mViewtoToggle.setVisibility(View.VISIBLE);
|
||||
mAnim = mViewtoToggle.animate();
|
||||
mAnim.alpha(1f)
|
||||
.setDuration(150)
|
||||
.setInterpolator(new DecelerateInterpolator(0.75f));
|
||||
mAnim.start();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,7 @@ package com.android.launcher3;
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.ActionBar;
|
||||
import android.app.Activity;
|
||||
import android.app.WallpaperManager;
|
||||
import android.content.Intent;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
@@ -26,6 +27,7 @@ import android.graphics.Bitmap;
|
||||
import android.graphics.Matrix;
|
||||
import android.graphics.Point;
|
||||
import android.graphics.RectF;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
@@ -116,8 +118,7 @@ public class WallpaperCropActivity extends BaseActivity implements Handler.Callb
|
||||
new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
boolean finishActivityWhenDone = true;
|
||||
cropImageAndSetWallpaper(imageUri, null, finishActivityWhenDone);
|
||||
cropImageAndSetWallpaper(imageUri, null);
|
||||
}
|
||||
});
|
||||
mSetWallpaperButton = findViewById(R.id.set_wallpaper_button);
|
||||
@@ -215,7 +216,7 @@ public class WallpaperCropActivity extends BaseActivity implements Handler.Callb
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
|
||||
protected boolean isActivityDestroyed() {
|
||||
public boolean isActivityDestroyed() {
|
||||
return Utilities.ATLEAST_JB_MR1 && isDestroyed();
|
||||
}
|
||||
|
||||
@@ -257,6 +258,7 @@ public class WallpaperCropActivity extends BaseActivity implements Handler.Callb
|
||||
mProgressView.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.KITKAT)
|
||||
public final void setCropViewTileSource(BitmapSource bitmapSource, boolean touchEnabled,
|
||||
boolean moveToLeft, CropViewScaleProvider scaleProvider, Runnable postExecute) {
|
||||
final LoadRequest req = new LoadRequest();
|
||||
@@ -266,6 +268,21 @@ public class WallpaperCropActivity extends BaseActivity implements Handler.Callb
|
||||
req.postExecute = postExecute;
|
||||
req.scaleProvider = scaleProvider;
|
||||
mCurrentLoadRequest = req;
|
||||
if (bitmapSource == null) {
|
||||
// Load the default wallpaper
|
||||
Drawable defaultWallpaper = WallpaperManager.getInstance(this)
|
||||
.getBuiltInDrawable(mCropView.getWidth(), mCropView.getHeight(),
|
||||
false, 0.5f, 0.5f);
|
||||
if (defaultWallpaper == null) {
|
||||
Log.w(LOGTAG, "Null default wallpaper encountered.");
|
||||
mCropView.setTileSource(null, null);
|
||||
return;
|
||||
}
|
||||
req.result = new DrawableTileSource(this,
|
||||
defaultWallpaper, DrawableTileSource.MAX_PREVIEW_SIZE);
|
||||
onLoadRequestComplete(req, true);
|
||||
return;
|
||||
}
|
||||
|
||||
// Remove any pending requests
|
||||
mLoaderHandler.removeMessages(MSG_LOAD_IMAGE);
|
||||
@@ -288,27 +305,17 @@ public class WallpaperCropActivity extends BaseActivity implements Handler.Callb
|
||||
return getResources().getBoolean(R.bool.allow_rotation);
|
||||
}
|
||||
|
||||
protected void setWallpaper(Uri uri, final boolean finishActivityWhenDone) {
|
||||
public void setWallpaper(Uri uri) {
|
||||
int rotation = BitmapUtils.getRotationFromExif(getContext(), uri);
|
||||
BitmapCropTask cropTask = new BitmapCropTask(
|
||||
getContext(), uri, null, rotation, 0, 0, true, false, null);
|
||||
final Point bounds = cropTask.getImageBounds();
|
||||
Runnable onEndCrop = new Runnable() {
|
||||
public void run() {
|
||||
WallpaperUtils.saveWallpaperDimensions(bounds.x, bounds.y, WallpaperCropActivity.this);
|
||||
if (finishActivityWhenDone) {
|
||||
setResult(Activity.RESULT_OK);
|
||||
finish();
|
||||
}
|
||||
}
|
||||
};
|
||||
CropAndFinishRunnable onEndCrop = new CropAndFinishRunnable(cropTask.getImageBounds());
|
||||
cropTask.setOnEndRunnable(onEndCrop);
|
||||
cropTask.setNoCrop(true);
|
||||
cropTask.execute();
|
||||
}
|
||||
|
||||
protected void cropImageAndSetWallpaper(
|
||||
Resources res, int resId, final boolean finishActivityWhenDone) {
|
||||
public void cropImageAndSetWallpaper(Resources res, int resId) {
|
||||
// crop this image and scale it down to the default wallpaper size for
|
||||
// this device
|
||||
int rotation = BitmapUtils.getRotationFromExif(res, resId, this);
|
||||
@@ -317,25 +324,17 @@ public class WallpaperCropActivity extends BaseActivity implements Handler.Callb
|
||||
getWindowManager());
|
||||
RectF crop = Utils.getMaxCropRect(
|
||||
inSize.x, inSize.y, outSize.x, outSize.y, false);
|
||||
Runnable onEndCrop = new Runnable() {
|
||||
public void run() {
|
||||
// Passing 0, 0 will cause launcher to revert to using the
|
||||
// default wallpaper size
|
||||
WallpaperUtils.saveWallpaperDimensions(0, 0, WallpaperCropActivity.this);
|
||||
if (finishActivityWhenDone) {
|
||||
setResult(Activity.RESULT_OK);
|
||||
finish();
|
||||
}
|
||||
}
|
||||
};
|
||||
// Passing 0, 0 will cause launcher to revert to using the
|
||||
// default wallpaper size
|
||||
CropAndFinishRunnable onEndCrop = new CropAndFinishRunnable(new Point(0, 0));
|
||||
BitmapCropTask cropTask = new BitmapCropTask(getContext(), res, resId,
|
||||
crop, rotation, outSize.x, outSize.y, true, false, onEndCrop);
|
||||
cropTask.execute();
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
|
||||
protected void cropImageAndSetWallpaper(Uri uri,
|
||||
BitmapCropTask.OnBitmapCroppedHandler onBitmapCroppedHandler, final boolean finishActivityWhenDone) {
|
||||
public void cropImageAndSetWallpaper(Uri uri,
|
||||
BitmapCropTask.OnBitmapCroppedHandler onBitmapCroppedHandler) {
|
||||
boolean centerCrop = getResources().getBoolean(R.bool.center_crop);
|
||||
// Get the crop
|
||||
boolean ltr = mCropView.getLayoutDirection() == View.LAYOUT_DIRECTION_LTR;
|
||||
@@ -408,18 +407,11 @@ public class WallpaperCropActivity extends BaseActivity implements Handler.Callb
|
||||
cropRect.top -= expandHeight;
|
||||
cropRect.bottom += expandHeight;
|
||||
}
|
||||
|
||||
final int outWidth = (int) Math.round(cropRect.width() * cropScale);
|
||||
final int outHeight = (int) Math.round(cropRect.height() * cropScale);
|
||||
CropAndFinishRunnable onEndCrop = new CropAndFinishRunnable(new Point(outWidth, outHeight));
|
||||
|
||||
Runnable onEndCrop = new Runnable() {
|
||||
public void run() {
|
||||
WallpaperUtils.saveWallpaperDimensions(outWidth, outHeight, WallpaperCropActivity.this);
|
||||
if (finishActivityWhenDone) {
|
||||
setResult(Activity.RESULT_OK);
|
||||
finish();
|
||||
}
|
||||
}
|
||||
};
|
||||
BitmapCropTask cropTask = new BitmapCropTask(getContext(), uri,
|
||||
cropRect, cropRotation, outWidth, outHeight, true, false, onEndCrop);
|
||||
if (onBitmapCroppedHandler != null) {
|
||||
@@ -428,6 +420,22 @@ public class WallpaperCropActivity extends BaseActivity implements Handler.Callb
|
||||
cropTask.execute();
|
||||
}
|
||||
|
||||
private class CropAndFinishRunnable implements Runnable {
|
||||
private final Point mBounds;
|
||||
|
||||
public CropAndFinishRunnable(Point bounds) {
|
||||
mBounds = bounds;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
WallpaperUtils.saveWallpaperDimensions(mBounds.x, mBounds.y,
|
||||
WallpaperCropActivity.this);
|
||||
setResult(Activity.RESULT_OK);
|
||||
finish();
|
||||
}
|
||||
}
|
||||
|
||||
static class LoadRequest {
|
||||
BitmapSource src;
|
||||
boolean touchEnabled;
|
||||
@@ -438,7 +446,7 @@ public class WallpaperCropActivity extends BaseActivity implements Handler.Callb
|
||||
TileSource result;
|
||||
}
|
||||
|
||||
interface CropViewScaleProvider {
|
||||
public interface CropViewScaleProvider {
|
||||
float getScale(TileSource src);
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+159
@@ -0,0 +1,159 @@
|
||||
package com.android.launcher3.wallpapertileinfo;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.Activity;
|
||||
import android.app.WallpaperManager;
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.BitmapFactory;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Point;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Build;
|
||||
import android.util.Log;
|
||||
|
||||
import com.android.gallery3d.common.BitmapUtils;
|
||||
import com.android.launcher3.LauncherFiles;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.WallpaperCropActivity.CropViewScaleProvider;
|
||||
import com.android.launcher3.WallpaperPickerActivity;
|
||||
import com.android.photos.views.TiledImageRenderer.TileSource;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
public class DefaultWallpaperInfo extends DrawableThumbWallpaperInfo {
|
||||
|
||||
private static final String TAG = "DefaultWallpaperInfo";
|
||||
|
||||
public DefaultWallpaperInfo(Drawable thumb) {
|
||||
super(thumb);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(WallpaperPickerActivity a) {
|
||||
a.setCropViewTileSource(null, false, false, new CropViewScaleProvider() {
|
||||
|
||||
@Override
|
||||
public float getScale(TileSource src) {
|
||||
return 1f;
|
||||
}
|
||||
}, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSave(WallpaperPickerActivity a) {
|
||||
try {
|
||||
WallpaperManager.getInstance(a.getContext()).clear();
|
||||
a.setResult(Activity.RESULT_OK);
|
||||
} catch (IOException e) {
|
||||
Log.w(TAG, "Setting wallpaper to default threw exception", e);
|
||||
}
|
||||
a.finish();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSelectable() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isNamelessWallpaper() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the system default wallpaper tile or null
|
||||
*/
|
||||
public static WallpaperTileInfo get(Context context) {
|
||||
return Utilities.ATLEAST_KITKAT
|
||||
? getDefaultWallpaper(context) : getPreKKDefaultWallpaperInfo(context);
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.KITKAT)
|
||||
private static DefaultWallpaperInfo getDefaultWallpaper(Context context) {
|
||||
File defaultThumbFile = getDefaultThumbFile(context);
|
||||
Bitmap thumb = null;
|
||||
boolean defaultWallpaperExists = false;
|
||||
Resources res = context.getResources();
|
||||
|
||||
if (defaultThumbFile.exists()) {
|
||||
thumb = BitmapFactory.decodeFile(defaultThumbFile.getAbsolutePath());
|
||||
defaultWallpaperExists = true;
|
||||
} else {
|
||||
Point defaultThumbSize = getDefaultThumbSize(res);
|
||||
Drawable wallpaperDrawable = WallpaperManager.getInstance(context).getBuiltInDrawable(
|
||||
defaultThumbSize.x, defaultThumbSize.y, true, 0.5f, 0.5f);
|
||||
if (wallpaperDrawable != null) {
|
||||
thumb = Bitmap.createBitmap(
|
||||
defaultThumbSize.x, defaultThumbSize.y, Bitmap.Config.ARGB_8888);
|
||||
Canvas c = new Canvas(thumb);
|
||||
wallpaperDrawable.setBounds(0, 0, defaultThumbSize.x, defaultThumbSize.y);
|
||||
wallpaperDrawable.draw(c);
|
||||
c.setBitmap(null);
|
||||
}
|
||||
if (thumb != null) {
|
||||
defaultWallpaperExists = saveDefaultWallpaperThumb(context, thumb);
|
||||
}
|
||||
}
|
||||
if (defaultWallpaperExists) {
|
||||
return new DefaultWallpaperInfo(new BitmapDrawable(res, thumb));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static ResourceWallpaperInfo getPreKKDefaultWallpaperInfo(Context context) {
|
||||
Resources sysRes = Resources.getSystem();
|
||||
Resources res = context.getResources();
|
||||
|
||||
int resId = sysRes.getIdentifier("default_wallpaper", "drawable", "android");
|
||||
|
||||
File defaultThumbFile = getDefaultThumbFile(context);
|
||||
Bitmap thumb = null;
|
||||
boolean defaultWallpaperExists = false;
|
||||
if (defaultThumbFile.exists()) {
|
||||
thumb = BitmapFactory.decodeFile(defaultThumbFile.getAbsolutePath());
|
||||
defaultWallpaperExists = true;
|
||||
} else {
|
||||
int rotation = BitmapUtils.getRotationFromExif(res, resId, context);
|
||||
thumb = createThumbnail(context, null, null, sysRes, resId, rotation, false);
|
||||
if (thumb != null) {
|
||||
defaultWallpaperExists = saveDefaultWallpaperThumb(context, thumb);
|
||||
}
|
||||
}
|
||||
if (defaultWallpaperExists) {
|
||||
return new ResourceWallpaperInfo(sysRes, resId, new BitmapDrawable(res, thumb));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static File getDefaultThumbFile(Context context) {
|
||||
return new File(context.getFilesDir(), Build.VERSION.SDK_INT
|
||||
+ "_" + LauncherFiles.DEFAULT_WALLPAPER_THUMBNAIL);
|
||||
}
|
||||
|
||||
private static boolean saveDefaultWallpaperThumb(Context c, Bitmap b) {
|
||||
// Delete old thumbnails.
|
||||
new File(c.getFilesDir(), LauncherFiles.DEFAULT_WALLPAPER_THUMBNAIL_OLD).delete();
|
||||
new File(c.getFilesDir(), LauncherFiles.DEFAULT_WALLPAPER_THUMBNAIL).delete();
|
||||
|
||||
for (int i = Build.VERSION_CODES.JELLY_BEAN; i < Build.VERSION.SDK_INT; i++) {
|
||||
new File(c.getFilesDir(), i + "_" + LauncherFiles.DEFAULT_WALLPAPER_THUMBNAIL).delete();
|
||||
}
|
||||
File f = getDefaultThumbFile(c);
|
||||
try {
|
||||
f.createNewFile();
|
||||
FileOutputStream thumbFileStream = c.openFileOutput(f.getName(), Context.MODE_PRIVATE);
|
||||
b.compress(Bitmap.CompressFormat.JPEG, 95, thumbFileStream);
|
||||
thumbFileStream.close();
|
||||
return true;
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, "Error while writing bitmap to file " + e);
|
||||
f.delete();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
package com.android.launcher3.wallpapertileinfo;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import com.android.launcher3.R;
|
||||
|
||||
/**
|
||||
* WallpaperTileInfo which uses drawable as the thumbnail.
|
||||
*/
|
||||
public abstract class DrawableThumbWallpaperInfo extends WallpaperTileInfo {
|
||||
|
||||
private final Drawable mThumb;
|
||||
|
||||
DrawableThumbWallpaperInfo(Drawable thumb) {
|
||||
mThumb = thumb;
|
||||
}
|
||||
|
||||
@Override
|
||||
public View createView(Context context, LayoutInflater inflator, ViewGroup parent) {
|
||||
mView = inflator.inflate(R.layout.wallpaper_picker_item, parent, false);
|
||||
setThumb(mThumb);
|
||||
return mView;
|
||||
}
|
||||
|
||||
public void setThumb(Drawable thumb) {
|
||||
if (mView != null && thumb != null) {
|
||||
thumb.setDither(true);
|
||||
ImageView image = (ImageView) mView.findViewById(R.id.wallpaper_image);
|
||||
image.setImageDrawable(thumb);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package com.android.launcher3.wallpapertileinfo;
|
||||
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
|
||||
import com.android.launcher3.WallpaperPickerActivity;
|
||||
import com.android.photos.BitmapRegionTileSource;
|
||||
import com.android.photos.BitmapRegionTileSource.BitmapSource;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public class FileWallpaperInfo extends DrawableThumbWallpaperInfo {
|
||||
|
||||
private final File mFile;
|
||||
|
||||
public FileWallpaperInfo(File target, Drawable thumb) {
|
||||
super(thumb);
|
||||
mFile = target;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(final WallpaperPickerActivity a) {
|
||||
a.setWallpaperButtonEnabled(false);
|
||||
final BitmapRegionTileSource.FilePathBitmapSource bitmapSource =
|
||||
new BitmapRegionTileSource.FilePathBitmapSource(mFile.getAbsolutePath());
|
||||
a.setCropViewTileSource(bitmapSource, false, true, null, new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
if (bitmapSource.getLoadingState() == BitmapSource.State.LOADED) {
|
||||
a.setWallpaperButtonEnabled(true);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSave(WallpaperPickerActivity a) {
|
||||
a.setWallpaper(Uri.fromFile(mFile));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSelectable() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isNamelessWallpaper() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
package com.android.launcher3.wallpapertileinfo;
|
||||
|
||||
import android.app.WallpaperInfo;
|
||||
import android.app.WallpaperManager;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.AsyncTask;
|
||||
import android.service.wallpaper.WallpaperService;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.WallpaperPickerActivity;
|
||||
|
||||
import org.xmlpull.v1.XmlPullParserException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.text.Collator;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
public class LiveWallpaperInfo extends WallpaperTileInfo {
|
||||
|
||||
private static final String TAG = "LiveWallpaperTile";
|
||||
|
||||
private Drawable mThumbnail;
|
||||
private WallpaperInfo mInfo;
|
||||
|
||||
public LiveWallpaperInfo(Drawable thumbnail, WallpaperInfo info, Intent intent) {
|
||||
mThumbnail = thumbnail;
|
||||
mInfo = info;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(WallpaperPickerActivity a) {
|
||||
Intent preview = new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER);
|
||||
preview.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT,
|
||||
mInfo.getComponent());
|
||||
a.startActivityForResultSafely(preview,
|
||||
WallpaperPickerActivity.PICK_WALLPAPER_THIRD_PARTY_ACTIVITY);
|
||||
}
|
||||
|
||||
@Override
|
||||
public View createView(Context context, LayoutInflater inflator, ViewGroup parent) {
|
||||
mView = inflator.inflate(R.layout.wallpaper_picker_live_wallpaper_item, parent, false);
|
||||
|
||||
ImageView image = (ImageView) mView.findViewById(R.id.wallpaper_image);
|
||||
ImageView icon = (ImageView) mView.findViewById(R.id.wallpaper_icon);
|
||||
if (mThumbnail != null) {
|
||||
image.setImageDrawable(mThumbnail);
|
||||
icon.setVisibility(View.GONE);
|
||||
} else {
|
||||
icon.setImageDrawable(mInfo.loadIcon(context.getPackageManager()));
|
||||
icon.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
TextView label = (TextView) mView.findViewById(R.id.wallpaper_item_label);
|
||||
label.setText(mInfo.loadLabel(context.getPackageManager()));
|
||||
return mView;
|
||||
}
|
||||
|
||||
/**
|
||||
* An async task to load various live wallpaper tiles.
|
||||
*/
|
||||
public static class LoaderTask extends AsyncTask<Void, Void, List<LiveWallpaperInfo>> {
|
||||
private final Context mContext;
|
||||
|
||||
public LoaderTask(Context context) {
|
||||
mContext = context;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<LiveWallpaperInfo> doInBackground(Void... params) {
|
||||
final PackageManager pm = mContext.getPackageManager();
|
||||
|
||||
List<ResolveInfo> list = pm.queryIntentServices(
|
||||
new Intent(WallpaperService.SERVICE_INTERFACE),
|
||||
PackageManager.GET_META_DATA);
|
||||
|
||||
Collections.sort(list, new Comparator<ResolveInfo>() {
|
||||
final Collator mCollator = Collator.getInstance();
|
||||
|
||||
public int compare(ResolveInfo info1, ResolveInfo info2) {
|
||||
return mCollator.compare(info1.loadLabel(pm), info2.loadLabel(pm));
|
||||
}
|
||||
});
|
||||
|
||||
List<LiveWallpaperInfo> result = new ArrayList<>();
|
||||
|
||||
for (ResolveInfo resolveInfo : list) {
|
||||
WallpaperInfo info = null;
|
||||
try {
|
||||
info = new WallpaperInfo(mContext, resolveInfo);
|
||||
} catch (XmlPullParserException | IOException e) {
|
||||
Log.w(TAG, "Skipping wallpaper " + resolveInfo.serviceInfo, e);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
Drawable thumb = info.loadThumbnail(pm);
|
||||
Intent launchIntent = new Intent(WallpaperService.SERVICE_INTERFACE);
|
||||
launchIntent.setClassName(info.getPackageName(), info.getServiceName());
|
||||
result.add(new LiveWallpaperInfo(thumb, info, launchIntent));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
package com.android.launcher3.wallpapertileinfo;
|
||||
|
||||
import android.Manifest;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.database.Cursor;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.os.Process;
|
||||
import android.provider.MediaStore;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.WallpaperPickerActivity;
|
||||
|
||||
public class PickImageInfo extends WallpaperTileInfo {
|
||||
|
||||
@Override
|
||||
public void onClick(WallpaperPickerActivity a) {
|
||||
Intent intent = new Intent(Intent.ACTION_GET_CONTENT).setType("image/*");
|
||||
a.startActivityForResultSafely(intent, WallpaperPickerActivity.IMAGE_PICK);
|
||||
}
|
||||
|
||||
@Override
|
||||
public View createView(Context context, LayoutInflater inflator, ViewGroup parent) {
|
||||
mView = inflator.inflate(R.layout.wallpaper_picker_image_picker_item, parent, false);
|
||||
|
||||
// Make its background the last photo taken on external storage
|
||||
Bitmap lastPhoto = getThumbnailOfLastPhoto(context);
|
||||
if (lastPhoto != null) {
|
||||
ImageView galleryThumbnailBg =
|
||||
(ImageView) mView.findViewById(R.id.wallpaper_image);
|
||||
galleryThumbnailBg.setImageBitmap(lastPhoto);
|
||||
int colorOverlay = context.getResources().getColor(R.color.wallpaper_picker_translucent_gray);
|
||||
galleryThumbnailBg.setColorFilter(colorOverlay, PorterDuff.Mode.SRC_ATOP);
|
||||
}
|
||||
|
||||
mView.setTag(this);
|
||||
return mView;
|
||||
}
|
||||
|
||||
private Bitmap getThumbnailOfLastPhoto(Context context) {
|
||||
boolean canReadExternalStorage = context.checkPermission(
|
||||
Manifest.permission.READ_EXTERNAL_STORAGE, Process.myPid(), Process.myUid()) ==
|
||||
PackageManager.PERMISSION_GRANTED;
|
||||
|
||||
if (!canReadExternalStorage) {
|
||||
// MediaStore.Images.Media.EXTERNAL_CONTENT_URI requires
|
||||
// the READ_EXTERNAL_STORAGE permission
|
||||
return null;
|
||||
}
|
||||
|
||||
Cursor cursor = MediaStore.Images.Media.query(context.getContentResolver(),
|
||||
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
|
||||
new String[] { MediaStore.Images.ImageColumns._ID,
|
||||
MediaStore.Images.ImageColumns.DATE_TAKEN},
|
||||
null, null, MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC LIMIT 1");
|
||||
|
||||
Bitmap thumb = null;
|
||||
if (cursor != null) {
|
||||
if (cursor.moveToNext()) {
|
||||
int id = cursor.getInt(0);
|
||||
thumb = MediaStore.Images.Thumbnails.getThumbnail(context.getContentResolver(),
|
||||
id, MediaStore.Images.Thumbnails.MINI_KIND, null);
|
||||
}
|
||||
cursor.close();
|
||||
}
|
||||
return thumb;
|
||||
}
|
||||
}
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
package com.android.launcher3.wallpapertileinfo;
|
||||
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Point;
|
||||
import android.graphics.RectF;
|
||||
import android.graphics.drawable.Drawable;
|
||||
|
||||
import com.android.gallery3d.common.Utils;
|
||||
import com.android.launcher3.WallpaperCropActivity.CropViewScaleProvider;
|
||||
import com.android.launcher3.WallpaperPickerActivity;
|
||||
import com.android.launcher3.util.WallpaperUtils;
|
||||
import com.android.photos.BitmapRegionTileSource;
|
||||
import com.android.photos.BitmapRegionTileSource.BitmapSource;
|
||||
import com.android.photos.views.TiledImageRenderer.TileSource;
|
||||
|
||||
public class ResourceWallpaperInfo extends DrawableThumbWallpaperInfo {
|
||||
|
||||
private final Resources mResources;
|
||||
private final int mResId;
|
||||
|
||||
public ResourceWallpaperInfo(Resources res, int resId, Drawable thumb) {
|
||||
super(thumb);
|
||||
mResources = res;
|
||||
mResId = resId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(final WallpaperPickerActivity a) {
|
||||
a.setWallpaperButtonEnabled(false);
|
||||
final BitmapRegionTileSource.ResourceBitmapSource bitmapSource =
|
||||
new BitmapRegionTileSource.ResourceBitmapSource(mResources, mResId, a);
|
||||
a.setCropViewTileSource(bitmapSource, false, false, new CropViewScaleProvider() {
|
||||
|
||||
@Override
|
||||
public float getScale(TileSource src) {
|
||||
Point wallpaperSize = WallpaperUtils.getDefaultWallpaperSize(
|
||||
a.getResources(), a.getWindowManager());
|
||||
RectF crop = Utils.getMaxCropRect(
|
||||
src.getImageWidth(), src.getImageHeight(),
|
||||
wallpaperSize.x, wallpaperSize.y, false);
|
||||
return wallpaperSize.x / crop.width();
|
||||
}
|
||||
}, new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
if (bitmapSource.getLoadingState() == BitmapSource.State.LOADED) {
|
||||
a.setWallpaperButtonEnabled(true);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSave(WallpaperPickerActivity a) {
|
||||
a.cropImageAndSetWallpaper(mResources, mResId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSelectable() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isNamelessWallpaper() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
+76
@@ -0,0 +1,76 @@
|
||||
package com.android.launcher3.wallpapertileinfo;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.WallpaperPickerActivity;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
|
||||
public class ThirdPartyWallpaperInfo extends WallpaperTileInfo {
|
||||
|
||||
private final ResolveInfo mResolveInfo;
|
||||
private final int mIconSize;
|
||||
|
||||
public ThirdPartyWallpaperInfo(ResolveInfo resolveInfo, int iconSize) {
|
||||
mResolveInfo = resolveInfo;
|
||||
mIconSize = iconSize;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(WallpaperPickerActivity a) {
|
||||
final ComponentName itemComponentName = new ComponentName(
|
||||
mResolveInfo.activityInfo.packageName, mResolveInfo.activityInfo.name);
|
||||
Intent launchIntent = new Intent(Intent.ACTION_SET_WALLPAPER)
|
||||
.setComponent(itemComponentName);
|
||||
a.startActivityForResultSafely(
|
||||
launchIntent, WallpaperPickerActivity.PICK_WALLPAPER_THIRD_PARTY_ACTIVITY);
|
||||
}
|
||||
|
||||
@Override
|
||||
public View createView(Context context, LayoutInflater inflator, ViewGroup parent) {
|
||||
mView = inflator.inflate(R.layout.wallpaper_picker_third_party_item, parent, false);
|
||||
|
||||
TextView label = (TextView) mView.findViewById(R.id.wallpaper_item_label);
|
||||
label.setText(mResolveInfo.loadLabel(context.getPackageManager()));
|
||||
Drawable icon = mResolveInfo.loadIcon(context.getPackageManager());
|
||||
icon.setBounds(new Rect(0, 0, mIconSize, mIconSize));
|
||||
label.setCompoundDrawables(null, icon, null, null);
|
||||
return mView;
|
||||
}
|
||||
|
||||
public static List<ThirdPartyWallpaperInfo> getAll(Context context) {
|
||||
ArrayList<ThirdPartyWallpaperInfo> result = new ArrayList<>();
|
||||
int iconSize = context.getResources().getDimensionPixelSize(R.dimen.wallpaperItemIconSize);
|
||||
|
||||
final PackageManager pm = context.getPackageManager();
|
||||
Intent pickImageIntent = new Intent(Intent.ACTION_GET_CONTENT).setType("image/*");
|
||||
HashSet<String> excludePackages = new HashSet<>();
|
||||
// Exclude packages which contain an image picker
|
||||
for (ResolveInfo info : pm.queryIntentActivities(pickImageIntent, 0)) {
|
||||
excludePackages.add(info.activityInfo.packageName);
|
||||
}
|
||||
excludePackages.add(context.getPackageName());
|
||||
excludePackages.add("com.android.wallpaper.livepicker");
|
||||
|
||||
final Intent pickWallpaperIntent = new Intent(Intent.ACTION_SET_WALLPAPER);
|
||||
for (ResolveInfo info : pm.queryIntentActivities(pickWallpaperIntent, 0)) {
|
||||
if (!excludePackages.contains(info.activityInfo.packageName)) {
|
||||
result.add(new ThirdPartyWallpaperInfo(info, iconSize));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
package com.android.launcher3.wallpapertileinfo;
|
||||
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.net.Uri;
|
||||
import android.os.AsyncTask;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.android.gallery3d.common.BitmapCropTask;
|
||||
import com.android.gallery3d.common.BitmapUtils;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.WallpaperPickerActivity;
|
||||
import com.android.photos.BitmapRegionTileSource;
|
||||
import com.android.photos.BitmapRegionTileSource.BitmapSource;
|
||||
|
||||
public class UriWallpaperInfo extends DrawableThumbWallpaperInfo {
|
||||
|
||||
private static final String TAG = "UriWallpaperInfo";
|
||||
|
||||
public final Uri mUri;
|
||||
|
||||
public UriWallpaperInfo(Uri uri) {
|
||||
super(null);
|
||||
mUri = uri;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(final WallpaperPickerActivity a) {
|
||||
a.setWallpaperButtonEnabled(false);
|
||||
final BitmapRegionTileSource.UriBitmapSource bitmapSource =
|
||||
new BitmapRegionTileSource.UriBitmapSource(a.getContext(), mUri);
|
||||
a.setCropViewTileSource(bitmapSource, true, false, null, new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
if (bitmapSource.getLoadingState() == BitmapSource.State.LOADED) {
|
||||
a.selectTile(mView);
|
||||
a.setWallpaperButtonEnabled(true);
|
||||
} else {
|
||||
ViewGroup parent = (ViewGroup) mView.getParent();
|
||||
if (parent != null) {
|
||||
parent.removeView(mView);
|
||||
Toast.makeText(a.getContext(), R.string.image_load_fail,
|
||||
Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSave(final WallpaperPickerActivity a) {
|
||||
BitmapCropTask.OnBitmapCroppedHandler h = new BitmapCropTask.OnBitmapCroppedHandler() {
|
||||
public void onBitmapCropped(byte[] imageBytes) {
|
||||
// rotation is set to 0 since imageBytes has already been correctly rotated
|
||||
Bitmap thumb = createThumbnail(a, null, imageBytes, null, 0, 0, true);
|
||||
a.getSavedImages().writeImage(thumb, imageBytes);
|
||||
}
|
||||
};
|
||||
a.cropImageAndSetWallpaper(mUri, h);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSelectable() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isNamelessWallpaper() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public void loadThumbnaleAsync(final WallpaperPickerActivity activity) {
|
||||
mView.setVisibility(View.GONE);
|
||||
new AsyncTask<Void, Void, Bitmap>() {
|
||||
protected Bitmap doInBackground(Void...args) {
|
||||
try {
|
||||
int rotation = BitmapUtils.getRotationFromExif(activity, mUri);
|
||||
return createThumbnail(activity, mUri, null, null, 0, rotation, false);
|
||||
} catch (SecurityException securityException) {
|
||||
if (activity.isActivityDestroyed()) {
|
||||
// Temporarily granted permissions are revoked when the activity
|
||||
// finishes, potentially resulting in a SecurityException here.
|
||||
// Even though {@link #isDestroyed} might also return true in different
|
||||
// situations where the configuration changes, we are fine with
|
||||
// catching these cases here as well.
|
||||
cancel(false);
|
||||
} else {
|
||||
// otherwise it had a different cause and we throw it further
|
||||
throw securityException;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
protected void onPostExecute(Bitmap thumb) {
|
||||
if (!isCancelled() && thumb != null) {
|
||||
setThumb(new BitmapDrawable(activity.getResources(), thumb));
|
||||
mView.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
Log.e(TAG, "Error loading thumbnail for uri=" + mUri);
|
||||
}
|
||||
}
|
||||
}.execute();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
package com.android.launcher3.wallpapertileinfo;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Matrix;
|
||||
import android.graphics.Point;
|
||||
import android.graphics.RectF;
|
||||
import android.net.Uri;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import com.android.gallery3d.common.BitmapCropTask;
|
||||
import com.android.gallery3d.common.Utils;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.WallpaperPickerActivity;
|
||||
|
||||
public abstract class WallpaperTileInfo {
|
||||
|
||||
protected View mView;
|
||||
|
||||
public void onClick(WallpaperPickerActivity a) {}
|
||||
|
||||
public void onSave(WallpaperPickerActivity a) {}
|
||||
|
||||
public void onDelete(WallpaperPickerActivity a) {}
|
||||
|
||||
public boolean isSelectable() { return false; }
|
||||
|
||||
public boolean isNamelessWallpaper() { return false; }
|
||||
|
||||
public void onIndexUpdated(CharSequence label) {
|
||||
if (isNamelessWallpaper()) {
|
||||
mView.setContentDescription(label);
|
||||
}
|
||||
}
|
||||
|
||||
public abstract View createView(Context context, LayoutInflater inflator, ViewGroup parent);
|
||||
|
||||
protected static Point getDefaultThumbSize(Resources res) {
|
||||
return new Point(res.getDimensionPixelSize(R.dimen.wallpaperThumbnailWidth),
|
||||
res.getDimensionPixelSize(R.dimen.wallpaperThumbnailHeight));
|
||||
|
||||
}
|
||||
|
||||
protected static Bitmap createThumbnail(Context context, Uri uri, byte[] imageBytes,
|
||||
Resources res, int resId, int rotation, boolean leftAligned) {
|
||||
Point size = getDefaultThumbSize(context.getResources());
|
||||
int width = size.x;
|
||||
int height = size.y;
|
||||
|
||||
BitmapCropTask cropTask;
|
||||
if (uri != null) {
|
||||
cropTask = new BitmapCropTask(
|
||||
context, uri, null, rotation, width, height, false, true, null);
|
||||
} else if (imageBytes != null) {
|
||||
cropTask = new BitmapCropTask(
|
||||
imageBytes, null, rotation, width, height, false, true, null);
|
||||
} else {
|
||||
cropTask = new BitmapCropTask(
|
||||
context, res, resId, null, rotation, width, height, false, true, null);
|
||||
}
|
||||
Point bounds = cropTask.getImageBounds();
|
||||
if (bounds == null || bounds.x == 0 || bounds.y == 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Matrix rotateMatrix = new Matrix();
|
||||
rotateMatrix.setRotate(rotation);
|
||||
float[] rotatedBounds = new float[] { bounds.x, bounds.y };
|
||||
rotateMatrix.mapPoints(rotatedBounds);
|
||||
rotatedBounds[0] = Math.abs(rotatedBounds[0]);
|
||||
rotatedBounds[1] = Math.abs(rotatedBounds[1]);
|
||||
|
||||
RectF cropRect = Utils.getMaxCropRect(
|
||||
(int) rotatedBounds[0], (int) rotatedBounds[1], width, height, leftAligned);
|
||||
cropTask.setCropBounds(cropRect);
|
||||
|
||||
if (cropTask.cropBitmap()) {
|
||||
return cropTask.getCroppedBitmap();
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user