/*
* 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.gallery3d.gadget;
import android.annotation.TargetApi;
import android.appwidget.AppWidgetManager;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.widget.RemoteViews;
import android.widget.RemoteViewsService;
import com.android.gallery3d.R;
import com.android.gallery3d.app.GalleryApp;
import com.android.gallery3d.common.ApiHelper;
import com.android.gallery3d.data.ContentListener;
@TargetApi(ApiHelper.VERSION_CODES.HONEYCOMB)
public class WidgetService extends RemoteViewsService {
@SuppressWarnings("unused")
private static final String TAG = "GalleryAppWidgetService";
public static final String EXTRA_WIDGET_TYPE = "widget-type";
public static final String EXTRA_ALBUM_PATH = "album-path";
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
int id = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
int type = intent.getIntExtra(EXTRA_WIDGET_TYPE, 0);
String albumPath = intent.getStringExtra(EXTRA_ALBUM_PATH);
return new PhotoRVFactory((GalleryApp) getApplicationContext(),
id, type, albumPath);
}
private static class PhotoRVFactory implements
RemoteViewsService.RemoteViewsFactory, ContentListener {
private final int mAppWidgetId;
private final int mType;
private final String mAlbumPath;
private final GalleryApp mApp;
private WidgetSource mSource;
public PhotoRVFactory(GalleryApp app, int id, int type, String albumPath) {
mApp = app;
mAppWidgetId = id;
mType = type;
mAlbumPath = albumPath;
}
@Override
public void onCreate() {
if (mType == WidgetDatabaseHelper.TYPE_ALBUM) {
mSource = new MediaSetSource(mApp.getDataManager(), mAlbumPath);
} else {
mSource = new LocalPhotoSource(mApp.getAndroidContext());
}
mSource.setContentListener(this);
AppWidgetManager.getInstance(mApp.getAndroidContext())
.notifyAppWidgetViewDataChanged(
mAppWidgetId, R.id.appwidget_stack_view);
}
@Override
public void onDestroy() {
mSource.close();
mSource = null;
}
@Override
public int getCount() {
return mSource.size();
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public RemoteViews getLoadingView() {
RemoteViews rv = new RemoteViews(
mApp.getAndroidContext().getPackageName(),
R.layout.appwidget_loading_item);
rv.setProgressBar(R.id.appwidget_loading_item, 0, 0, true);
return rv;
}
@Override
public RemoteViews getViewAt(int position) {
Bitmap bitmap = mSource.getImage(position);
if (bitmap == null) return getLoadingView();
RemoteViews views = new RemoteViews(
mApp.getAndroidContext().getPackageName(),
R.layout.appwidget_photo_item);
views.setImageViewBitmap(R.id.appwidget_photo_item, bitmap);
views.setOnClickFillInIntent(R.id.appwidget_photo_item, new Intent()
.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
.setData(mSource.getContentUri(position)));
return views;
}
@Override
public void onDataSetChanged() {
mSource.reload();
}
@Override
public void onContentDirty() {
AppWidgetManager.getInstance(mApp.getAndroidContext())
.notifyAppWidgetViewDataChanged(
mAppWidgetId, R.id.appwidget_stack_view);
}
}
}