/* * Protocoder * A prototyping platform for Android devices * * Victor Diaz Barrales victormdb@gmail.com * * Copyright (C) 2014 Victor Diaz * Copyright (C) 2013 Motorola Mobility LLC * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software * is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ package org.protocoder.appApi; import android.app.ProgressDialog; import android.content.Intent; import android.graphics.Color; import android.graphics.PorterDuff; import android.net.Uri; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.view.ViewPager; import android.view.View; import android.widget.Toast; import org.protocoder.R; import org.protocoder.fragments.NewProjectDialogFragment; import org.protocoder.projectlist.ProjectItem; import org.protocoder.projectlist.ProjectListFragment; import org.protocoder.projectlist.ProjectsPagerAdapter; import org.protocoder.projectlist.ZoomOutPageTransformer; import org.protocoder.views.ProjectSelectorStrip; import org.protocoderrunner.apprunner.AppRunnerActivity; import org.protocoderrunner.apprunner.api.PUtil; import org.protocoderrunner.project.Project; import org.protocoderrunner.project.ProjectManager; import org.protocoderrunner.utils.AndroidUtils; import org.protocoderrunner.utils.MLog; import java.io.File; public class ProtoScripts { private static final String TAG = "ProtoScripts"; private Protocoder mProtocoder; private int mProjectRequestCode = 1; private Intent currentProjectApplicationIntent; ProjectsPagerAdapter mProjectPagerAdapter; // fragments that hold the projects private ViewPager mViewPager; ProtoScripts(Protocoder protocoder) { this.mProtocoder = protocoder; init(); } public void init() { //init views mProjectPagerAdapter = new ProjectsPagerAdapter(mProtocoder.a.getSupportFragmentManager()); final ProjectSelectorStrip strip = (ProjectSelectorStrip) mProtocoder.a.findViewById(R.id.pager_title_strip); mViewPager = (ViewPager) mProtocoder.a.findViewById(R.id.pager); mViewPager.setAdapter(mProjectPagerAdapter); mViewPager.setPageTransformer(true, new ZoomOutPageTransformer()); //TODO remove at some point //colors final int c0 = mProtocoder.a.getResources().getColor(R.color.project_user_color); final int c1 = mProtocoder.a.getResources().getColor(R.color.project_example_color); mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { int c = AndroidUtils.calculateColor(arg0 + arg1, c0, c1); strip.setBackgroundColor(c); } @Override public void onPageScrollStateChanged(int arg0) { } }); } public java.util.ArrayList<Project> getProjectsInFolder(String folder) { return ProjectManager.getInstance().list(folder, true); } public void goTo(String folder) { int num = mProjectPagerAdapter.getFragmentNumByName(folder); mViewPager.setCurrentItem(num, true); } public void goTo(String folder, String appName) { goTo(folder); final ProjectListFragment plf = mProjectPagerAdapter.getFragmentByName(folder); final int id = plf.findAppPosByName(appName); PUtil util = new PUtil(mProtocoder.a); util.delay(200, new PUtil.delayCB() { @Override public void event() { plf.goTo(id); } }); } public void highlight(String folder, String appName) { final ProjectListFragment plf = mProjectPagerAdapter.getFragmentByName(folder); ProjectItem view = (ProjectItem) getViewByName(folder, appName); int pos = plf.findAppPosByName(appName); plf.projectAdapter.projects.get(pos).selected = true; view.setHighlighted(true); } public void resetHighlighting(String folder) { final ProjectListFragment plf = mProjectPagerAdapter.getFragmentByName(folder); plf.resetHighlighting(); } public View getViewByName(String folder, String appName) { final ProjectListFragment plf = mProjectPagerAdapter.getFragmentByName(folder); ProjectItem view = (ProjectItem) plf.getView(appName); int pos = plf.findAppPosByName(appName); //-> plf.projectAdapter.projects.get(pos).selected = true; view.setHighlighted(true); return view; } public void goNext() { mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1); } public void goPrevious() { mViewPager.setCurrentItem(mViewPager.getCurrentItem() - 1); } public void addScriptList(int icon, String name, int color, boolean orderByName) { ProjectListFragment listFragmentBase = ProjectListFragment.newInstance(icon, name, color, orderByName); listFragmentBase.icon = icon; listFragmentBase.projectFolder = name; listFragmentBase.color = color; listFragmentBase.orderByName = orderByName; mProjectPagerAdapter.addFragment(name, listFragmentBase); mProjectPagerAdapter.notifyDataSetChanged(); } public void refresh(String folder, String appName) { final ProjectListFragment plf = mProjectPagerAdapter.getFragmentByName(folder); plf.projectRefresh(appName); } public void rename(String folder, String appName) { } public void run(String folder, String appName) { if (currentProjectApplicationIntent != null) { mProtocoder.a.finishActivity(mProjectRequestCode); currentProjectApplicationIntent = null; } try { currentProjectApplicationIntent = new Intent(mProtocoder.a, AppRunnerActivity.class); if (AndroidUtils.isVersionL()) { //TODO enable version Android-L //currentProjectApplicationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); } else { currentProjectApplicationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } currentProjectApplicationIntent.putExtra(Project.FOLDER, folder); currentProjectApplicationIntent.putExtra(Project.NAME, appName); mProtocoder.a.overridePendingTransition(R.anim.splash_slide_in_anim_set, R.anim.splash_slide_out_anim_set); mProtocoder.a.startActivityForResult(currentProjectApplicationIntent, mProjectRequestCode); } catch (Exception e) { MLog.d(TAG, "Error launching script"); } } //TODO public void createProject(String folder, String appName) { //create file Project newProject = ProjectManager.getInstance().addNewProject(mProtocoder.a, appName, folder, appName); //notify ui final ProjectListFragment plf = mProjectPagerAdapter.getFragmentByName(folder); plf.mProjects.add(newProject); plf.notifyAddedProject(); } public void delete(String folder, String appName) { } public void createFileName(String folder, String appName, String fileName) { } public void deleteFileName(String folder, String appName, String fileName) { } public String exportProto(String folder, String fileName) { Project p = ProjectManager.getInstance().get(folder, fileName); String zipFilePath = ProjectManager.getInstance().createBackup(p); return zipFilePath; } public void createProjectDialog() { FragmentManager fm = mProtocoder.a.getSupportFragmentManager(); NewProjectDialogFragment newProjectDialog = new NewProjectDialogFragment(); newProjectDialog.show(fm, "fragment_edit_name"); // implements NewProjectDialogFragment.NewProjectDialogListener newProjectDialog.setListener(new NewProjectDialogFragment.NewProjectDialogListener() { @Override public void onFinishEditDialog(String inputText) { Toast.makeText(mProtocoder.a, "Creating " + inputText, Toast.LENGTH_SHORT).show(); createProject(ProjectManager.FOLDER_USER_PROJECTS, inputText); } }); } public void listRefresh() { for (ProjectListFragment fragment : mProjectPagerAdapter.fragments) { fragment.refreshProjects(); } } public void shareProtoFileDialog(String folder, String name) { final ProgressDialog progress = new ProgressDialog(mProtocoder.a); progress.setTitle("Exporting .proto"); progress.setMessage("Your project will be ready soon!"); progress.setCancelable(true); progress.setCanceledOnTouchOutside(false); progress.show(); String zipFilePath = exportProto(folder, name); Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(zipFilePath))); shareIntent.setType("application/zip"); progress.dismiss(); mProtocoder.a.startActivity(Intent.createChooser(shareIntent, mProtocoder.a.getResources().getText(R.string.share_proto_file))); } public void shareMainJsDialog(String folder, String name) { Project p = ProjectManager.getInstance().get(folder, name); Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, ProjectManager.getInstance().getCode(p)); sendIntent.setType("text/plain"); mProtocoder.a.startActivity(Intent.createChooser(sendIntent, mProtocoder.a.getResources().getText(R.string.send_to))); } public void addShortcut(String folder, String name) { Project p = ProjectManager.getInstance().get(folder, name); Intent.ShortcutIconResource icon; //TODO remove this way of selecting icons if (folder.equals("examples")) { icon = Intent.ShortcutIconResource.fromContext(mProtocoder.a, R.drawable.protocoder_script_example); } else { icon = Intent.ShortcutIconResource.fromContext(mProtocoder.a, R.drawable.protocoder_script_project); } try { Intent shortcutIntent = new Intent(mProtocoder.a, AppRunnerActivity.class); shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); String script = ProjectManager.getInstance().getCode(p); shortcutIntent.putExtra(Project.NAME, p.getName()); shortcutIntent.putExtra(Project.FOLDER, p.getFolder()); final Intent putShortCutIntent = new Intent(); putShortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); putShortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, p.getName()); putShortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon); putShortCutIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT"); mProtocoder.a.sendBroadcast(putShortCutIntent); } catch (Exception e) { // TODO } // Show toast Toast.makeText(mProtocoder.a, "Adding shortcut for " + p.getName(), Toast.LENGTH_SHORT).show(); } public void reinitScriptList() { mProjectPagerAdapter.addFragment("", (ProjectListFragment) getFragment(0)); mProjectPagerAdapter.addFragment("", (ProjectListFragment) getFragment(1)); mProjectPagerAdapter.notifyDataSetChanged(); } private Fragment getFragment(int position){ return mProtocoder.a.getSupportFragmentManager().findFragmentByTag(getFragmentTag(position)); } private String getFragmentTag(int position) { return "android:switcher:" + R.id.pager + ":" + position; } // public void reinitScriptList() { // ProjectListFragment f0 = (ProjectListFragment) mProjectPagerAdapter.getItem(0); // mProjectPagerAdapter.addFragment("", ); // } }