package edu.mit.mitmobile2.mit150; import java.util.ArrayList; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.Spannable; import android.text.style.ForegroundColorSpan; import android.text.style.StyleSpan; import android.util.Log; import android.view.Display; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.LinearLayout.LayoutParams; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.ScrollView; import android.widget.TextView; import edu.mit.mitmobile2.CommonActions; import edu.mit.mitmobile2.FullScreenLoader; import edu.mit.mitmobile2.MobileWebApi; import edu.mit.mitmobile2.Module; import edu.mit.mitmobile2.ModuleActivity; import edu.mit.mitmobile2.R; import edu.mit.mitmobile2.SectionHeader; public class MainMIT150Activity extends ModuleActivity { FullScreenLoader mLoader; LinearLayout top; Context ctx; MIT150Model mit150model = new MIT150Model(this); public static final String TAG = "MainMIT150Activity"; @Override protected void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); Log.d(TAG, "onCreate()"); setContentView(R.layout.mit150_home); ctx = this; mLoader = (FullScreenLoader) findViewById(R.id.mit150HomeLoader); mLoader.showLoading(); Handler mMIT150LoadedHandler = new Handler() { @Override public void handleMessage(Message msg) { if(msg.arg1 == MobileWebApi.SUCCESS) { mLoader.setVisibility(View.GONE); createMoreView(); setContent(); } else { // TODO show cached? mLoader.showError(); } } }; mit150model.fetchMIT150(ctx, mMIT150LoadedHandler); } /*********************************************************************/ void setContent() { ImageView btn; TextView tv; RelativeLayout rl; Bitmap bm; BitmapDrawable bd; LayoutParams params; int[] heights = new int[3]; int[] widths = new int[3]; int h,w; float scale; MIT150FeatureItem f; Display display = getWindowManager().getDefaultDisplay(); int screenWidth = display.getWidth(); ArrayList<MIT150FeatureItem> fs = mit150model.getFeatures(ctx); if (fs.size()<3) return; ////////////////////////////////////////////////// // Set button images and click handlers int[] image_ids = {R.id.mit150WelcomeIV,R.id.mit150CorridorIV,R.id.mit150EventsIV}; int[] tv_ids = {R.id.mit150WelcomeTV,R.id.mit150CorridorTV,R.id.mit150EventsTV}; for (int fx=0; fx<fs.size(); fx++) { f = fs.get(fx); bm = BitmapUtils.getRoundedCornerBitmap(this, f.bm,0); btn = (ImageView) findViewById(image_ids[fx]); bd = new BitmapDrawable(bm); btn.setBackgroundDrawable(bd); heights[fx] = bm.getHeight(); widths[fx] = bm.getWidth(); // Textview background and colors tv = (TextView) findViewById(tv_ids[fx]); if ((f.subtitle==null) || ("".equalsIgnoreCase(f.subtitle))) { tv.setText(f.title); tv.setTextColor(f.getTitleColor() | 0xFF000000); RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) tv.getLayoutParams(); layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP); tv.setLayoutParams(layoutParams); } else { setText(tv,f.title,f.subtitle,f.getTitleColor() | 0xFF000000); bm = BitmapUtils.createRoundedBottomBitmap(this, widths[fx], 50, overlayColor(f.getTintColor())); bd = new BitmapDrawable(bm); tv.setBackgroundDrawable(bd); } // Action final String url = f.url; btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { CommonActions.doAction(ctx, url); } }); } ////////////////////////////////////////////////// // Welcome f = fs.get(0); if (f!=null) { rl = (RelativeLayout) findViewById(R.id.mit150WelcomeFL); params = new LinearLayout.LayoutParams((int) (0.333*screenWidth),LayoutParams.FILL_PARENT); rl.setLayoutParams(params); } // Corridor f = fs.get(1); if (f!=null) { rl = (RelativeLayout) findViewById(R.id.mit150CorridorRL);; params = new LinearLayout.LayoutParams((int) (0.66*screenWidth),LayoutParams.FILL_PARENT); rl.setLayoutParams(params); // FIXME // U+25B9 WHITE RIGHT-POINTING SMALL TRIANGLE //String rightArrow = "<html><body>▹</body></html>"; //tv.setText(Html.fromHtml(rightArrow).toString()); //Typeface tf; //tf = Typeface.createFromAsset(getAssets(), "fonts/marvosym.ttf"); //tv.setTypeface(tf); //tv.setText("\u2219\u00B7"); } ////////////////////////////////// // Adjust layout h = (int) Math.round((float)heights[0] / (float) widths[0] * 0.33 * (float)screenWidth); LinearLayout ll = (LinearLayout) findViewById(R.id.mit150FirstRowLL); params = new LinearLayout.LayoutParams(screenWidth,h); ll.setLayoutParams(params); scale = (float) screenWidth / (float) widths[2]; h = (int) (scale * (float) heights[2]); w = (int) (scale * (float) widths[2]); rl = (RelativeLayout) findViewById(R.id.mit150EventsRL); params = new LinearLayout.LayoutParams(w,h+7); rl.setLayoutParams(params); top = (LinearLayout) findViewById(R.id.mit150Top); top.requestLayout(); top.invalidate(); // Scroll to top of screen final ScrollView sv = (ScrollView) findViewById(R.id.mit150SV); sv.post(new Runnable() { @Override public void run() { sv.scrollTo(0, 0); } }); } /*********************************************************************/ @SuppressWarnings("static-access") void createMoreView() { LayoutParams lp; LayoutInflater vi = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); int height; top = (LinearLayout) findViewById(R.id.mit150Top); for (MIT150MoreFeaturesItem mf : mit150model.more_features) { // Section... lp = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT); SectionHeader sh = new SectionHeader(this,mf.section_title); sh.setLayoutParams(lp); sh.setPadding(0, 7, 0, 0); top.addView(sh); // List... final ArrayList<MIT150MoreItem> items = mf.items; ListView lv = new ListView(this); lv = (ListView) vi.inflate(R.layout.mit150_lv, null); lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { MIT150MoreItem mi = items.get(position); CommonActions.doAction(ctx, mi.url); } }); MIT150MoreAdapter mma = new MIT150MoreAdapter(ctx, 0, items); int row_height = BitmapUtils.convertDipsToPixels(ctx, 75); height = items.size()*row_height; lp = new LayoutParams(LayoutParams.FILL_PARENT,height); lv.setLayoutParams(lp); lv.setAdapter(mma); top.addView(lv); } } /*********************************************************************/ void setText(TextView tv, String title, String body, int color) { String all = title + "\n"+ body; tv.setText(all, TextView.BufferType.SPANNABLE); Spannable str = (Spannable) tv.getText(); int len = title.length(); str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 0, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); str.setSpan(new ForegroundColorSpan(color), 0, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); str.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), len+1, all.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); str.setSpan(new ForegroundColorSpan(0xFFFFFFFF), len+1, all.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } /*********************************************************************/ private static int overlayColor(int tintColor) { int red = (tintColor / (256 * 256)) % 256; int blue = (tintColor / (256)) % 256; int green = ((tintColor / (1))) % 256; // divide each channel by three red = red / 3; blue = blue / 3; green = green / 3; int alpha = 154; // use 0.6 for the alpha return 256*(256*(256*alpha + red) + blue) + green; } @Override protected Module getModule() { return new MIT150Module(); } @Override public boolean isModuleHomeActivity() { return true; } @Override protected void prepareActivityOptionsMenu(Menu menu) { } }