package com.almalence.widget; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Set; import org.xmlpull.v1.XmlPullParserException; import com.almalence.util.Util; /* <!-- +++ import com.almalence.opencam_plus.R; +++ --> */ //<!-- -+- import com.almalence.opencam.R; //-+- --> import android.appwidget.AppWidgetManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; import android.util.DisplayMetrics; import android.util.Log; import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.RemoteViews; import android.widget.RemoteViewsService; public class OpenCameraSolidWidgetService extends RemoteViewsService { @Override public RemoteViewsFactory onGetViewFactory(Intent intent) { return new OpenCameraSolidRemoteViewsFactory(this.getApplicationContext(), intent); } } class OpenCameraSolidRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory { private static int mCount = 0; private List<OpenCameraWidgetItem> mWidgetItems = new ArrayList<OpenCameraWidgetItem>(); private Context mContext; private int mAppWidgetId; SharedPreferences prefs; //public static Map<Integer, OpenCameraWidgetItem> modeGridAssoc; public OpenCameraSolidRemoteViewsFactory(Context context, Intent intent) { mContext = context; mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); } @Override public void onCreate() { prefs = PreferenceManager.getDefaultSharedPreferences(mContext); // if(modeGridAssoc == null) // modeGridAssoc = new Hashtable<Integer, OpenCameraWidgetItem>(); //mWidgetItems.clear(); fillWidgetItemList(); //AppWidgetManager.getInstance(mContext).notifyAppWidgetViewDataChanged(mAppWidgetId, R.id.widgetSolidGrid); //fillWidgetItemList(); } @Override public void onDestroy() { // In onDestroy() you should tear down anything that was setup for your data source, // eg. cursors, connections, etc. mWidgetItems.clear(); // AppWidgetManager.getInstance(mContext).notifyAppWidgetViewDataChanged(mAppWidgetId, R.id.widgetSolidGrid); } @Override public int getCount() { return mCount; } @Override public RemoteViews getViewAt(int position) { // position will always range from 0 to getCount() - 1. RemoteViews rv = null; // if(position == mCount-1) // { // rv = new RemoteViews(mContext.getPackageName(), R.layout.widget_opencamera_mode_grid_element); // //rv.setTextViewText(R.id.modeText, mWidgetItems.get(position).modeName); // rv.setImageViewResource(R.id.modeImage, R.drawable.widget_settings); // // // Next, we set a fill-intent which will be used to fill-in the pending intent template // // which is set on the collection view in StackWidgetProvider. // // //Intent configIntent = new Intent(mContext, OpenCameraWidgetConfigureActivity.class); // Intent configIntent = new Intent(); // configIntent.putExtra(OpenCameraWidgetProvider.BROADCAST_PARAM_IS_MODE, false); // configIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); // configIntent.setData(Uri.withAppendedPath(Uri.parse("abc" + "://widget/id/"), String.valueOf(mAppWidgetId))); // //rv.setOnClickFillInIntent(R.id.modeSelectLayout, configIntent); // rv.setOnClickFillInIntent(R.id.modeImage, configIntent); // } // else if(mWidgetItems != null && mWidgetItems.size() > position) if(mWidgetItems != null && mWidgetItems.size() > position) { OpenCameraWidgetItem item = mWidgetItems.get(position); if(item.modeName.contains("hide")) return null; // float elementHeight = -1; // if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) // elementHeight = calculateElementHeight(); // We construct a remote views item based on our widget item xml file, and set the // text based on the position. rv = new RemoteViews(mContext.getPackageName(), R.layout.widget_opencamera_solid_mode_grid_element); rv.setImageViewResource(R.id.modeImage, item.modeIconID); int colorIndex = PreferenceManager.getDefaultSharedPreferences(mContext).getInt("solidwidgetBGColorIndex" + mAppWidgetId, 0x5A000000); if(colorIndex == 2) rv.setInt(R.id.modeSelectLayout, "setBackgroundResource", R.drawable.widget_solid_grid_element_red_background); else if(colorIndex == 0) rv.setInt(R.id.modeSelectLayout, "setBackgroundResource", R.drawable.widget_solid_grid_element_translucent_background); else if(colorIndex == 1) rv.setInt(R.id.modeSelectLayout, "setBackgroundResource", R.drawable.widget_solid_grid_element_transparent_background); // // rv.setInt(R.id.modeSelectLayout, "setBackgroundColor", bgColor); // Next, we set a fill-intent which will be used to fill-in the pending intent template // which is set on the collection view in StackWidgetProvider. Bundle extras = new Bundle(); extras.putBoolean(OpenCameraWidgetProvider.BROADCAST_PARAM_IS_MODE, true); if(item.modeName.contains("torch") || item.modeName.contains("barcode")) extras.putString(OpenCameraWidgetConfigureActivity.EXTRA_ITEM, "single"); else extras.putString(OpenCameraWidgetConfigureActivity.EXTRA_ITEM, item.modeName); if(item.isTorchOn) extras.putBoolean(OpenCameraWidgetConfigureActivity.EXTRA_TORCH, true); if(item.modeName.contains("barcode")) extras.putBoolean(OpenCameraWidgetConfigureActivity.EXTRA_BARCODE, true); if(item.modeName.contains("settings")) { extras.putBoolean(OpenCameraWidgetProvider.BROADCAST_PARAM_IS_MODE, false); extras.putInt(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); } //Intent fillInIntent = new Intent(mContext, MainScreen.class); Intent fillInIntent = new Intent(); fillInIntent.putExtras(extras); //rv.setOnClickFillInIntent(R.id.modeSelectLayout, fillInIntent); rv.setOnClickFillInIntent(R.id.modeImage, fillInIntent); } // Return the remote views object. return rv; } @Override public RemoteViews getLoadingView() { // You can create a custom loading view (for instance when getViewAt() is slow.) If you // return null here, you will get the default loading view. return null; } public int getViewTypeCount() { return 1; } public long getItemId(int position) { return position; } public boolean hasStableIds() { return true; } @Override public void onDataSetChanged() { // mWidgetItems.clear(); fillWidgetItemList(); // This is triggered when you call AppWidgetManager notifyAppWidgetViewDataChanged // on the collection view corresponding to this factory. You can do heaving lifting in // here, synchronously. For example, if you need to process an image, fetch something // from the network, etc., it is ok to do it here, synchronously. The widget will remain // in its current state while work is being done here, so you don't need to worry about // locking up the widget. } private synchronized void fillWidgetItemList() { // try { // ConfigParser.getInstance().parse(mContext); // } catch (XmlPullParserException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } catch (IOException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // // List<Mode> modeList = ConfigParser.getInstance().getList(); // Iterator<Mode> it = modeList.iterator(); // while(it.hasNext()) // { // Mode tmp = it.next(); // if(tmp.modeName.contains("hdr") || tmp.modeName.contains("panorama") // || tmp.modeName.contains("single") || tmp.modeName.contains("video") || tmp.modeName.contains("night")) // { // int iconID = mContext.getResources().getIdentifier( // tmp.icon, "drawable", // mContext.getPackageName()); // OpenCameraWidgetItem mode = new OpenCameraWidgetItem(tmp.modeID, iconID, false); // mWidgetItems.add(mode); // } // } // // int iconID = mContext.getResources().getIdentifier("gui_almalence_settings_flash_torch", "drawable", mContext.getPackageName()); // OpenCameraWidgetItem mode = new OpenCameraWidgetItem("torch", iconID, true); // mWidgetItems.add(mode); // // mCount = mWidgetItems.size(); if(OpenCameraSolidWidgetConfigureActivity.modeGridAssoc != null) { mWidgetItems.clear(); Set<Integer> unsorted_keys = OpenCameraSolidWidgetConfigureActivity.modeGridAssoc.keySet(); List<Integer> keys = Util.asSortedList(unsorted_keys); Iterator<Integer> it = keys.iterator(); while(it.hasNext()) { int gridIndex = it.next(); OpenCameraWidgetItem modeInfo = OpenCameraSolidWidgetConfigureActivity.modeGridAssoc.get(gridIndex); if(!modeInfo.modeName.contains("hide")) mWidgetItems.add(modeInfo); } mCount = mWidgetItems.size(); } else { mWidgetItems.clear(); int modeCount = 6; for(int i = 0; i < modeCount; i++) { String modeID = prefs.getString("solidwidgetAddedModeID" + mAppWidgetId + String.valueOf(i), "hide"); if(!modeID.contains("hide")) { int modeIcon = prefs.getInt("solidwidgetAddedModeIcon" + mAppWidgetId + String.valueOf(i), 0); OpenCameraWidgetItem modeInfo = new OpenCameraWidgetItem(modeID, modeIcon, modeID.contains("torch")); mWidgetItems.add(modeInfo); } } mCount = mWidgetItems.size(); } } }