package com.garlicg.cutinlib.viewsupport; import java.util.ArrayList; import java.util.List; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ServiceInfo; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.net.Uri; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewStub; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; import com.garlicg.cutinlib.CutinItem; import com.garlicg.cutinlib.CutinManagerUtils; import com.garlicg.cutinlib.CutinService; import com.garlicg.cutinlib.Demo; public class SimpleCutinScreen{ public final static int STATE_VIEW = 0; public final static int STATE_PICK = 1; private int mState = STATE_VIEW; private View mViewParent; private PickListener mListener; private Demo mDemo; private View mGetView; private ListView mListView; private Context mContext; public SimpleCutinScreen(Context context , Intent intent){ mContext = context; mDemo = new Demo(context); if(CutinManagerUtils.isCalledFromCutinManager(intent)){ // Call from official cut-in app mState = STATE_PICK; } else{ mState = STATE_VIEW; } } private View newPaddingView(Context context){ View padding = new View(context); ListView.LayoutParams padding8 = new ListView.LayoutParams(ListView.LayoutParams.MATCH_PARENT,dpToPx(context.getResources(),8)); padding.setLayoutParams(padding8); return padding; } private int dpToPx(Resources res , int dp){ return (int)(res.getDisplayMetrics().density * dp + 0.5f); } public View getView(){ mViewParent = LayoutInflater.from(mContext).inflate(R.layout.cutin_simple_screen, null); // setupListView mListView = (ListView)mViewParent.findViewById(R.id.__cutin_simple_ListView); mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { Object item = arg0.getItemAtPosition(arg2); if(item instanceof CutinItem){ CutinItem ci = (CutinItem)item; mDemo.play(ci.serviceClass , ci.cutinId); } else if(arg2 == 0 && mGetView != null){ Intent intent = new Intent( Intent.ACTION_VIEW, Uri.parse("market://details?id=com.garlicg.cutin")); mContext.startActivity(intent); } } }); if(CutinManagerUtils.existManager(mContext)){ mListView.addHeaderView(newPaddingView(mContext)); } else{ mGetView = LayoutInflater.from(mContext).inflate(R.layout.cutin_get_manager,null); mListView.addHeaderView(mGetView); } mListView.addFooterView(newPaddingView(mContext)); if(getState() == STATE_PICK){ // inflate footer ViewStub stub = (ViewStub)mViewParent.findViewById(R.id.__cutin_simple_PickerFrame); View bottomFrame = stub.inflate(); // OK button View okButton = bottomFrame.findViewById(R.id.__cutin_okButton); okButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(mListener != null){ int position = mListView.getCheckedItemPosition(); Object item = mListView.getItemAtPosition(position); if(item != null && item instanceof CutinItem){ CutinItem ci = (CutinItem)item; mListener.ok(CutinManagerUtils.buildResultIntent(ci)); } else { // no selected item } } } }); // Cancel button View cancel = bottomFrame.findViewById(R.id.__cutin_cancelButton); cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(mListener != null){ mListener.cancel(); } } }); } return mViewParent; } public int getState(){ return mState; } public interface PickListener{ public void ok(Intent intent); public void cancel(); } public void setListener(PickListener listener){ mListener = listener; } public void resume(){ // remove view after get the manager app from this. if(CutinManagerUtils.existManager(mContext) && mGetView != null){ mListView.removeHeaderView(mGetView); mGetView = null; } } public void pause(){ mDemo.forceStop(); } public void setCutinList(ArrayList<CutinItem> list){ mListView = (ListView)mViewParent.findViewById(R.id.__cutin_simple_ListView); // launched from launcher ,etc if(mState == STATE_VIEW){ SimpleCutinAdapter adapter = new SimpleCutinAdapter(mViewParent.getContext(), R.layout.cutin_list_item_1,list); mListView.setAdapter(adapter); } // launched from manage app else if(mState == STATE_PICK){ // Set ListView with SingleChoiceMode. SimpleCutinAdapter adapter = new SimpleCutinAdapter(mViewParent.getContext(), R.layout.cutin_list_item_single_choice,list); mListView.setAdapter(adapter); mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); } } public static class Category extends CutinItem{ public Category(String label){ super(null, label); } } private class SimpleCutinAdapter extends ArrayAdapter<CutinItem>{ private Drawable[] mDrawables; private final int RESOURCE_ID; private final int RESOURCE_CATEGORY_ID; LayoutInflater mInflater; public SimpleCutinAdapter(Context context, int resource, List<CutinItem> objects) { super(context, resource, android.R.id.text1,objects); RESOURCE_ID = resource; RESOURCE_CATEGORY_ID = R.layout.cutin_list_item_category; mInflater = LayoutInflater.from(context); if(objects != null){ mDrawables = new Drawable[objects.size()]; int size = mDrawables.length; PackageManager pm = context.getPackageManager(); for(int i = 0 ; i < size ; i++){ mDrawables[i] = getServiceIcon(objects.get(i).serviceClass, pm); } } } private Drawable getServiceIcon(Class<? extends CutinService> serviceClass ,PackageManager pm){ Drawable icon = null; if(serviceClass != null){ try { Resources res = getContext().getResources(); ServiceInfo si = pm.getServiceInfo(new ComponentName(getContext(), serviceClass), 0); if(si.icon != 0){ icon = res.getDrawable(si.icon); int bond = (int)(res.getDisplayMetrics().density * 48 + 0.5f); icon.setBounds(0, 0, bond,bond ); } } catch (NameNotFoundException e) { } catch (Resources.NotFoundException e) { } } return icon; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; CutinItem item = getItem(position); if(item instanceof Category){ view = mInflater.inflate(RESOURCE_CATEGORY_ID, null); TextView text = (TextView)view.findViewById(android.R.id.text1); text.setText(item.cutinName); } else{ view = mInflater.inflate(RESOURCE_ID, null); TextView text = (TextView)view.findViewById(android.R.id.text1); text.setText(item.cutinName); if(mDrawables[position] != null){ text.setCompoundDrawables(mDrawables[position],null, null, null); } else{ text.setCompoundDrawables(null,null, null, null); } } return view; } @Override public boolean isEnabled(int position) { Object obj = getItem(position); return !(obj instanceof Category); } } }