19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.dumprendertree;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
20ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.util.Arrays;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhuimport android.app.AlertDialog;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.ListActivity;
28f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhuimport android.content.DialogInterface;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ListView;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.SimpleAdapter;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhupublic abstract class FileList extends ListActivity
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	public boolean onKeyDown(int keyCode, KeyEvent event) {
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		switch (keyCode)
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		{
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project			case KeyEvent.KEYCODE_DPAD_LEFT:
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project				if (mPath.length() > mBaseLength) {
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project					File f = new File(mPath);
44f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu					mFocusFile = f.getName();
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project					mFocusIndex = 0;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project					f = f.getParentFile();
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project					mPath = f.getPath();
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project					updateList();
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project					return true;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project				}
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project				break;
52f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project			case KeyEvent.KEYCODE_DPAD_RIGHT:
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project				{
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project					Map map = (Map) getListView().getItemAtPosition(getListView().getSelectedItemPosition());
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project					String path = (String)map.get("path");
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project					if ((new File(path)).isDirectory()) {
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project						mPath = path;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project				        mFocusFile = null;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project						updateList();
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project					} else {
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project						processFile(path, false);
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project					}
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project				}
66f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project			default:
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project				break;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		}
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		return super.onKeyDown(keyCode, event);
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	}
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu	public void onCreate(Bundle icicle)
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onCreate(icicle);
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setupPath();
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        updateList();
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
79f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected List getData()
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        List myData = new ArrayList<HashMap>();
83f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = new File(mPath);
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!f.exists()) {
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        	addItem(myData, "!LayoutTests path missing!", "");
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        	return myData;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String[] files = f.list();
90ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        Arrays.sort(files);
91ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < files.length; i++) {
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        	StringBuilder sb = new StringBuilder(mPath);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        	sb.append(File.separatorChar);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        	sb.append(files[i]);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        	String path = sb.toString();
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        	File c = new File(path);
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        	if (fileFilter(c)) {
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	        	if (c.isDirectory()) {
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	        		addItem(myData, "<"+files[i]+">", path);
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	        		if (mFocusFile != null && mFocusFile.equals(files[i]))
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	        			mFocusIndex = myData.size()-1;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	        	}
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	        	else
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	        	    addItem(myData, files[i], path);
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        	}
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
108f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return myData;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
111f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void addItem(List<Map> data, String name, String path)
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        HashMap temp = new HashMap();
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        temp.put("title", name);
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        temp.put("path", path);
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.add(temp);
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
119f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onListItemClick(ListView l, View v, int position, long id)
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
122f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        Map map = (Map) l.getItemAtPosition(position);
123f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        final String path = (String)map.get("path");
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((new File(path)).isDirectory()) {
126f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            final CharSequence[] items = {"Open", "Run"};
127f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            AlertDialog.Builder builder = new AlertDialog.Builder(this);
128f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            builder.setTitle("Select an Action");
129f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            builder.setSingleChoiceItems(items, -1,
130f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                    new DialogInterface.OnClickListener(){
131f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                public void onClick(DialogInterface dialog, int which) {
132f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                    switch (which) {
133f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                        case OPEN_DIRECTORY:
134f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                            dialog.dismiss();
135f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                            mPath = path;
136f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                            mFocusFile = null;
137f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                            updateList();
138f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                            break;
139f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                        case RUN_TESTS:
140f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                            dialog.dismiss();
141f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                            processDirectory(path, false);
142f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                            break;
143f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                    }
144f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                }
145f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            });
146f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            builder.create().show();
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            processFile(path, false);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
151f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
152f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu    /*
153f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu     * This function is called when the user has selected a directory in the
154f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu     * list and wants to perform an action on it instead of navigating into
155f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu     * the directory.
156f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu     */
157f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu    abstract void processDirectory(String path, boolean selection);
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This function is called when the user has selected a file in the
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * file list. The selected file could be a file or a directory.
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The flag indicates if this was from a selection or not.
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    abstract void processFile(String filename, boolean selection);
164f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This function is called when the file list is being built. Return
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * true if the file is to be added to the file list.
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    abstract boolean fileFilter(File f);
170f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void updateList() {
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setListAdapter(new SimpleAdapter(this,
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                getData(),
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.R.layout.simple_list_item_1,
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new String[] {"title"},
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new int[] {android.R.id.text1}));
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String title = mPath; //.substring(mBaseLength-11); // show the word LayoutTests
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setTitle(title);
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getListView().setSelection(mFocusIndex);
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
181f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
182f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu    protected void setupPath()
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    	mPath = "/sdcard/android/layout_tests";
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    	mBaseLength = mPath.length();
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
187f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected String mPath;
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int mBaseLength;
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected String mFocusFile;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int mFocusIndex;
192f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
193f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu    private final static int OPEN_DIRECTORY = 0;
194f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu    private final static int RUN_TESTS = 1;
195f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
197