package com.dianping.app; import java.io.File; import java.io.FileInputStream; import java.util.Locale; import org.json.JSONObject; import android.app.Application; import android.content.Intent; import android.net.Uri; import android.text.TextUtils; import android.util.Log; import com.dianping.loader.LoaderActivity; import com.dianping.loader.MainActivity; import com.dianping.loader.MyClassLoader; import com.dianping.loader.RepositoryManager; import com.dianping.loader.model.FileSpec; import com.dianping.loader.model.FragmentSpec; import com.dianping.loader.model.SiteSpec; public class MyApplication extends Application { public static final String PRIMARY_SCHEME = "app"; private static MyApplication instance; private RepositoryManager repoManager; public static MyApplication instance() { if (instance == null) { throw new IllegalStateException("Application has not been created"); } return instance; } public MyApplication() { instance = this; } public RepositoryManager repositoryManager() { if (repoManager == null) { repoManager = new RepositoryManager(this); } return repoManager; } public SiteSpec readSite() { File dir = new File(getFilesDir(), "repo"); File local = new File(dir, "site.txt"); if (local.length() > 0) { try { FileInputStream fis = new FileInputStream(local); byte[] bytes = new byte[fis.available()]; int l = fis.read(bytes); fis.close(); String str = new String(bytes, 0, l, "UTF-8"); JSONObject json = new JSONObject(str); return new SiteSpec(json); } catch (Exception e) { Log.w("loader", "fail to load site.txt from " + local, e); } } return new SiteSpec("empty.0", "0", new FileSpec[0], new FragmentSpec[0]); } public Intent urlMap(Intent intent) { do { // already specify a class, no need to map url if (intent.getComponent() != null) break; // only process my scheme uri Uri uri = intent.getData(); if (uri == null) break; if (uri.getScheme() == null) break; if (!(PRIMARY_SCHEME.equalsIgnoreCase(uri.getScheme()))) break; SiteSpec site = null; if (intent.hasExtra("_site")) { site = intent.getParcelableExtra("_site"); } if (site == null) { site = readSite(); intent.putExtra("_site", site); } // i'm responsible intent.setClass(this, LoaderActivity.class); String host = uri.getHost(); if (TextUtils.isEmpty(host)) break; host = host.toLowerCase(Locale.US); FragmentSpec fragment = site.getFragment(host); if (fragment == null) break; intent.putExtra("_fragment", fragment.name()); // class loader ClassLoader classLoader; if (TextUtils.isEmpty(fragment.code())) { classLoader = getClassLoader(); } else { intent.putExtra("_code", fragment.code()); FileSpec fs = site.getFile(fragment.code()); if (fs == null) break; classLoader = MyClassLoader.getClassLoader(site, fs); if (classLoader == null) break; } intent.setClass(this, MainActivity.class); } while (false); return intent; } @Override public void startActivity(Intent intent) { intent = urlMap(intent); super.startActivity(intent); } }