/* * 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.projectlist; import android.animation.Animator; import android.animation.Animator.AnimatorListener; import android.animation.AnimatorInflater; import android.animation.AnimatorSet; import android.annotation.SuppressLint; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.graphics.Color; import android.graphics.PorterDuff; import android.os.Bundle; import android.os.Handler; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.animation.CycleInterpolator; import android.widget.AdapterView; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.OnItemClickListener; import android.widget.GridView; import org.protocoder.MainActivity; import org.protocoder.R; import org.protocoder.appApi.Protocoder; import org.protocoder.fragments.SettingsFragment; import org.protocoderrunner.base.BaseFragment; import org.protocoderrunner.events.Events.ProjectEvent; import org.protocoderrunner.project.Project; import org.protocoderrunner.project.ProjectManager; import org.protocoderrunner.utils.MLog; import java.util.ArrayList; import de.greenrobot.event.EventBus; @SuppressLint("NewApi") public class ProjectListFragment extends BaseFragment { private String TAG = "ProjectListFragment"; public ArrayList<Project> mProjects; public ProjectItemAdapter projectAdapter; protected GridView gridView; public String projectFolder; boolean listMode; public int color; public int icon; public boolean orderByName; public int num = 0; public static int totalNum = 0; //public Intent.ShortcutIconResource icon; public ProjectListFragment() { num = totalNum++; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.projectFolder = getArguments().getString("folderName"); this.color = getArguments().getInt("color"); this.icon = getArguments().getInt("icon"); this.orderByName = getArguments().getBoolean("orderByName"); mProjects = ProjectManager.getInstance().list(this.projectFolder, this.orderByName); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //this.icon = getArguments().getString("icon"); View v = inflater.inflate(R.layout.fragment_project, container, false); // Get GridView and set adapter gridView = (GridView) v.findViewById(R.id.gridview); listMode = SettingsFragment.getListPreference(getActivity()); if (listMode) { gridView.setNumColumns(1); } // set the empty state gridView.setEmptyView(v.findViewById(R.id.empty_grid_view)); registerForContextMenu(gridView); gridView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, final View v, final int position, long id) { // ProjectAnimations.projectLaunch(v); AnimatorSet animSpin; animSpin = (AnimatorSet) AnimatorInflater.loadAnimator(v.getContext(), R.animator.flip_up); animSpin.setTarget(v); animSpin.addListener(new AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { } @Override public void onAnimationCancel(Animator animation) { } }); animSpin.start(); Runnable r = new Runnable() { @Override public void run() { Project project = mProjects.get(position); ProjectEvent evt = new ProjectEvent(project, "run"); EventBus.getDefault().post(evt); getActivity().overridePendingTransition(R.anim.splash_slide_in_anim_set, R.anim.splash_slide_out_anim_set); } }; //Thread t = new Thread(r); Handler handler = new Handler(); handler.postDelayed(r, 50); //t.start(); } }); return v; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //setRetainInstance(true); //icon = Intent.ShortcutIconResource.fromContext(getActivity(), R.drawable.ic_script_example); projectAdapter = new ProjectItemAdapter(getActivity(), this.projectFolder, this.mProjects, this.listMode, this.icon); gridView.setAdapter(projectAdapter); notifyAddedProject(); } @Override public void onAttach(Activity activity) { super.onAttach(activity); } public static ProjectListFragment newInstance(int icon, String folderName, int color, boolean orderByName) { ProjectListFragment myFragment = new ProjectListFragment(); Bundle args = new Bundle(); args.putInt("icon", icon); args.putString("folderName", folderName); args.putInt("color", color); args.putBoolean("orderByName", orderByName); myFragment.setArguments(args); return myFragment; } public void refreshProjects() { mProjects = ProjectManager.getInstance().list(this.projectFolder, this.orderByName); notifyAddedProject(); } protected void deleteProject(int position) { Project p = mProjects.get(position); ProjectManager.getInstance().deleteProject(p); mProjects.remove(position); projectAdapter.notifyDataSetChanged(); gridView.invalidateViews(); } public int findAppIdByName(String appName) { int id = -1; for (int i = 0; i < mProjects.size(); i++) { String name = mProjects.get(i).getName(); if (name.equals(appName)) { id = i; break; } } return id; } public int findAppPosByName(String appName) { int pos = -1; for (int i = 0; i < mProjects.size(); i++) { String name = mProjects.get(i).getName(); if (name.equals(appName)) { pos = (int) projectAdapter.getItemId(i); break; } } return pos; } public View getViewByName(String appName) { int pos = findAppPosByName(appName); View view = projectAdapter.getView(pos, null, null); return view; } public void goTo(int pos) { if (pos != -1) gridView.smoothScrollToPosition(pos); } public View highlight(String projectName, boolean b) { View v = gridView.findViewWithTag(projectName); MLog.d(TAG, "view is " + v); v.setSelected(b); projectAdapter.projects.get(findAppIdByName(projectName)).selected = true; v.getBackground().setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY); return v; } public void clear() { gridView.removeAllViews(); projectAdapter.notifyDataSetChanged(); } public void notifyAddedProject() { projectAdapter.notifyDataSetChanged(); gridView.invalidateViews(); } @Override public View getView() { return super.getView(); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater = getActivity().getMenuInflater(); inflater.inflate(R.menu.project_list, menu); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onContextItemSelected(MenuItem item) { if (getUserVisibleHint()) { // Handle menu events and return true } else { return false; // Pass the event to the next fragment } AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); final int index = info.position; Project project = mProjects.get(index); int itemId = item.getItemId(); if (itemId == R.id.menu_project_list_run) { Protocoder.getInstance(getActivity()).protoScripts.run(project.getFolder(), project.getName()); return true; } else if (itemId == R.id.menu_project_list_edit) { Protocoder.getInstance(getActivity()).app.editor.show(true, project.getFolder(), project.getName()); return true; } else if (itemId == R.id.menu_project_list_delete) { Protocoder.getInstance(getActivity()).protoScripts.delete(project.getFolder(), project.getName()); DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case DialogInterface.BUTTON_POSITIVE: deleteProject(index); break; case DialogInterface.BUTTON_NEGATIVE: break; } } }; AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setMessage("Are you sure?").setPositiveButton("Yes", dialogClickListener) .setNegativeButton("No", dialogClickListener).show(); return true; } else if (itemId == R.id.menu_project_list_add_shortcut) { Protocoder.getInstance(getActivity()).protoScripts.addShortcut(project.getFolder(), project.getName()); return true; } else if (itemId == R.id.menu_project_list_share_with) { Protocoder.getInstance(getActivity()).protoScripts.shareMainJsDialog(project.getFolder(), project.getName()); return true; } else if (itemId == R.id.menu_project_list_share_proto_file) { Protocoder.getInstance(getActivity()).protoScripts.shareProtoFileDialog(project.getFolder(), project.getName()); return true; } else { return super.onContextItemSelected(item); } } @Override public void onPause() { super.onPause(); } @Override public void onResume() { super.onResume(); if(!((MainActivity)getActivity()).isWear()) { ((MainActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(false); } } @Override public void onDestroy() { super.onDestroy(); } @Override public void onDestroyView() { super.onDestroyView(); } public void projectRefresh(String projectName) { getView(projectName).animate().alpha(0).setDuration(500).setInterpolator(new CycleInterpolator(1)); } public View getView(String projectName) { return gridView.findViewWithTag(projectName); } public void resetHighlighting() { for (int i = 0; i < mProjects.size(); i++) { mProjects.get(i).selected = false; } for (int i = 0; i < gridView.getChildCount(); i++) { ProjectItem v = (ProjectItem) gridView.getChildAt(i); if (v.isHighlighted()) { v.setHighlighted(false); } } } public void onEventMainThread(ProjectEvent evt) { if (evt.getAction() == "run") { projectRefresh(evt.getProject().getName()); } } }