Merge branch 'master' of https://github.com/owncloud/android into material_buttons
[pub/Android/ownCloud.git] / src / com / owncloud / android / ui / dialog / FileActionsDialogFragment.java
1 package com.owncloud.android.ui.dialog;
2
3 import android.support.v4.app.DialogFragment;
4 import android.os.Bundle;
5 import android.view.LayoutInflater;
6 import android.view.Menu;
7 import android.view.MenuItem;
8 import android.view.View;
9 import android.view.ViewGroup;
10 import android.view.Window;
11 import android.widget.AdapterView;
12 import android.widget.AdapterView.OnItemClickListener;
13 import android.widget.ArrayAdapter;
14 import android.widget.ListView;
15 import android.widget.TextView;
16
17 import com.owncloud.android.R;
18 import com.owncloud.android.ui.dialog.parcel.MenuItemParcelable;
19 import com.owncloud.android.ui.dialog.parcel.MenuParcelable;
20
21 import java.util.ArrayList;
22 import java.util.List;
23
24 /**
25 * Dialog for choosing a file action.
26 */
27 public class FileActionsDialogFragment extends DialogFragment implements
28 OnItemClickListener {
29 private static final String ARG_ITEM_LIST = "ITEM_LIST";
30 private static final String ARG_FILE_POSITION = "FILE_POSITION";
31 private static final String ARG_FILE_NAME = "FILE_NAME";
32 public static final String FTAG_FILE_ACTIONS = "FILE_ACTIONS_FRAGMENT";
33
34 private List<MenuItemParcelable> mMenuItems;
35
36 private int mFilePosition;
37
38 private ListView mListView;
39
40 /**
41 * Listener interface for the file action fragment.
42 */
43 public interface FileActionsDialogFragmentListener {
44 public boolean onFileActionChosen(int menuId, int filePosition);
45 }
46
47 /**
48 * Public factory method to create new FileActionsDialogFragment instances.
49 *
50 * @param menu menu to be display.
51 * @return Dialog ready to show.
52 */
53 public static FileActionsDialogFragment newInstance(Menu menu, int filePosition, String fileName) {
54 FileActionsDialogFragment fragment = new FileActionsDialogFragment();
55 Bundle args = new Bundle();
56
57 MenuParcelable menuParcelable = new MenuParcelable();
58 menuParcelable.setMenuItems(calculateMenuParcel(menu));
59
60 args.putParcelable(ARG_ITEM_LIST, menuParcelable);
61 args.putInt(ARG_FILE_POSITION, filePosition);
62 args.putCharSequence(ARG_FILE_NAME, fileName);
63
64 fragment.setArguments(args);
65 return fragment;
66 }
67
68 /**
69 * {@inheritDoc}
70 */
71 @Override
72 public void onCreate(Bundle savedInstanceState) {
73 super.onCreate(savedInstanceState);
74 setStyle(DialogFragment.STYLE_NORMAL, R.style.ownCloud_Dialog);
75 }
76
77 /**
78 * {@inheritDoc}
79 */
80 @Override
81 public View onCreateView(LayoutInflater inflater, ViewGroup container,
82 Bundle savedInstanceState) {
83 View view = inflater.inflate(R.layout.file_actions, null, false);
84 mListView = (ListView) view.findViewById(R.id.file_actions_list);
85
86 CharSequence title = getArguments().getCharSequence(ARG_FILE_NAME);
87 if(title != null && title.length() > 0) {
88 TextView header = (TextView)view.findViewById(R.id.file_actions_header);
89 header.setText(title);
90 header.setVisibility(View.VISIBLE);
91 view.findViewById(R.id.file_actions_header_divider).setVisibility(View.VISIBLE);
92 } else {
93 getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
94 }
95
96 return view;
97 }
98
99
100 /**
101 * {@inheritDoc}
102 */
103 @Override
104 public void onActivityCreated(Bundle savedInstanceState) {
105 super.onActivityCreated(savedInstanceState);
106
107 mFilePosition = getArguments().getInt(ARG_FILE_POSITION);
108
109 MenuParcelable menu = getArguments().getParcelable(ARG_ITEM_LIST);
110 mMenuItems = menu.getMenuItems();
111 List<String> stringList = new ArrayList<String>();
112 for (int i = 0; i < mMenuItems.size(); i++) {
113 stringList.add(mMenuItems.get(i).getMenuText());
114 }
115
116 ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
117 R.layout.simple_dialog_list_item, stringList);
118
119 mListView.setAdapter(adapter);
120
121 mListView.setOnItemClickListener(this);
122 }
123
124 /**
125 * {@inheritDoc}
126 */
127 @Override
128 public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
129 dismiss();
130 ((FileActionsDialogFragmentListener) getTargetFragment())
131 .onFileActionChosen(mMenuItems.get(position).getMenuItemId(), mFilePosition);
132 }
133
134 /**
135 * calculates a parcelable list of MenuItemParcelable based on the given menu and the visibility of the menu items.
136 *
137 * @param menu the menu to be displayed
138 * @return a filtered List of parcelables based on the menu
139 */
140 private static List<MenuItemParcelable> calculateMenuParcel(Menu menu) {
141 int index = 0;
142 boolean hasNext = true;
143 List<MenuItemParcelable> itemList = new ArrayList<MenuItemParcelable>();
144 MenuParcelable menuParcelable = new MenuParcelable();
145 try {
146 while (hasNext) {
147 MenuItem item = menu.getItem(index);
148 if (item.isVisible()) {
149 itemList.add(new MenuItemParcelable(item));
150 }
151 index++;
152 }
153 } catch (IndexOutOfBoundsException iobe) {
154 // reach the end of the item list
155 }
156
157 return itemList;
158 }
159 }