package com.demo; import java.io.File; import java.io.FilenameFilter; import android.app.Activity; import android.app.Dialog; import android.app.ProgressDialog; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { private final static int PROGRESS_DIALOG = 1; private final static String APP_DIRECTORY = "fragmentdemo"; private ProgressDialog progressDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.main); Button downloadFragment = (Button) this .findViewById(R.id.download_fragment); downloadFragment.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new FragmentDownloader() .download("http://upload.visusnet.de/ECi/fragment.zip"); } }); Button loadFragmentCache = (Button) this .findViewById(R.id.load_fragment_cache); loadFragmentCache.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new FragmentCacheLoader().execute(); } }); Button startDemo = (Button) this.findViewById(R.id.start_demo); startDemo.setEnabled(false); startDemo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, DynamicFragmentActivity.class); intent.putExtra("class_name", "com.demo.DemoFragment"); startActivity(intent); } }); } @Override protected Dialog onCreateDialog(int id) { switch (id) { case PROGRESS_DIALOG: this.progressDialog = new ProgressDialog(this); return this.progressDialog; default: return null; } } private class FragmentDownloader extends FileDownloader { public void download(String jarUrl) { String fragmentDirectory = Environment .getExternalStorageDirectory() + "/" + APP_DIRECTORY; this.execute(jarUrl, fragmentDirectory); } @Override protected void onPreExecute() { showDialog(PROGRESS_DIALOG); progressDialog.setMessage("Downloading Fragment..."); progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.setMax(100); } @Override protected void onProgressUpdate(final Integer... values) { progressDialog.setProgress(values[0]); } @Override protected void onPostExecute(String jarPath) { if (jarPath != null) { // Add the APK/JAR/ZIP file's classes to the class loader. MultiDexClassLoader.getInstance().install(MainActivity.this, jarPath); Button startDemo = (Button) findViewById(R.id.start_demo); startDemo.setEnabled(true); } dismissDialog(PROGRESS_DIALOG); } } private class FragmentCacheLoader extends AsyncTask<Void, Void, Integer> { @Override protected void onPreExecute() { showDialog(PROGRESS_DIALOG); progressDialog.setMessage("Loading Fragment Cache..."); progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); } @Override protected Integer doInBackground(Void... params) { String fragmentDirectory = Environment .getExternalStorageDirectory() + "/" + APP_DIRECTORY; File fragmentDir = new File(fragmentDirectory); if (fragmentDir.exists()) { int numFragments = 0; for (File fragmentFile : fragmentDir .listFiles(new FragmentFileFilter())) { MultiDexClassLoader.getInstance().install( MainActivity.this, fragmentFile.getAbsolutePath()); numFragments++; } return numFragments; } return 0; } @Override protected void onPostExecute(Integer result) { dismissDialog(PROGRESS_DIALOG); if (result > 0) { Button startDemo = (Button) findViewById(R.id.start_demo); startDemo.setEnabled(true); } else { Toast.makeText(MainActivity.this, "Could not find any cached Fragments", Toast.LENGTH_LONG).show(); } } } private class FragmentFileFilter implements FilenameFilter { @Override public boolean accept(File dir, String filename) { if (filename.endsWith(".apk") || filename.endsWith(".jar") || filename.endsWith(".zip")) { return true; } return false; } } }