Rev 17 |
View as "text/plain" |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
1
package de.pointedears.converter;
/*
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.ListActivity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;
/**
* Generates the main menu as a list of activities from the manifest
*
* @author
* Thomas 'PointedEars' Lahn;
* Class courtesy of The Android Open Source Project
* (Android 2.2 SDK Examples), slightly adapted
*/
public class MenuActivity
extends ListActivity
{
@
Override
public void onCreate
(Bundle savedInstanceState
)
{
super.
onCreate(savedInstanceState
);
Intent intent =
this.
getIntent();
String path = intent.
getStringExtra("de.pointedears.converter.Path"); //$NON-NLS-1$
if (path ==
null)
{
path =
""; //$NON-NLS-1$
}
this.
setListAdapter(new SimpleAdapter
(this,
this.
getData(path
),
android.
R.
layout.
simple_list_item_1,
new String[] { "title" },
//$NON-NLS-1$
new int[] { android.
R.
id.
text1 }));
this.
getListView().
setTextFilterEnabled(true);
}
/**
* @param prefix
* @return
*/
protected List getData
(String prefix
)
{
List<Map> myData =
new ArrayList<Map>();
Intent mainIntent =
new Intent
(Intent.
ACTION_MAIN,
null);
mainIntent.
addCategory(ConverterApplication.
CATEGORY_CONVERTER);
PackageManager pm =
this.
getPackageManager();
List<ResolveInfo
> list = pm.
queryIntentActivities(mainIntent,
0);
if (null == list
)
{
return myData
;
}
String[] prefixPath
;
if (prefix.
equals("")) //$NON-NLS-1$
{
prefixPath =
null;
}
else
{
prefixPath = prefix.
split("/"); //$NON-NLS-1$
}
int len = list.
size();
Map<String,
Boolean> entries =
new HashMap<String,
Boolean>();
for (int i =
0; i
< len
; i++
)
{
ResolveInfo info = list.
get(i
);
CharSequence labelSeq = info.
loadLabel(pm
);
String label = labelSeq
!=
null
? labelSeq.
toString()
: info.
activityInfo.
name;
if (prefix.
length() ==
0 || label.
startsWith(prefix
))
{
String[] labelPath = label.
split("/"); //$NON-NLS-1$
String nextLabel =
prefixPath ==
null ? labelPath
[0] : labelPath
[prefixPath.
length];
if ((prefixPath
!=
null ? prefixPath.
length :
0) == labelPath.
length -
1)
{
this.
addItem(myData, nextLabel,
this.
activityIntent(
info.
activityInfo.
applicationInfo.
packageName,
info.
activityInfo.
name));
}
else
{
if (entries.
get(nextLabel
) ==
null)
{
this.
addItem(
myData,
nextLabel,
this.
browseIntent(prefix.
equals("") ? nextLabel : prefix +
"/" //$NON-NLS-1$//$NON-NLS-2$
+ nextLabel
));
entries.
put(nextLabel,
true);
}
}
}
}
Collections.
sort(myData, MenuActivity.
sDisplayNameComparator);
return myData
;
}
private final static Comparator<Map> sDisplayNameComparator =
new Comparator<Map>() {
private final Collator collator =
Collator.
getInstance();
public int compare
(Map map1,
Map map2
)
{
return this.
collator.
compare(map1.
get("title"), map2.
get("title")); //$NON-NLS-1$ //$NON-NLS-2$
}
};
/**
* @param pkg
* @param componentName
* @return
*/
protected Intent activityIntent
(String pkg,
String componentName
)
{
Intent result =
new Intent
();
result.
setClassName(pkg, componentName
);
return result
;
}
/**
* @param path
* @return
*/
protected Intent browseIntent
(String path
)
{
Intent result =
new Intent
();
result.
setClass(this, MenuActivity.
class);
result.
putExtra("de.pointedears.converter.Path", path
); //$NON-NLS-1$
return result
;
}
/**
* @param data
* @param name
* @param intent
*/
protected void addItem
(List<Map> data,
String name, Intent intent
)
{
Map<String,
Object> temp =
new HashMap<String,
Object>();
temp.
put("title", name
); //$NON-NLS-1$
temp.
put("intent", intent
); //$NON-NLS-1$
data.
add(temp
);
}
/*
* (non-Javadoc)
*
* @see android.app.ListActivity#onListItemClick(android.widget.ListView,
* android.view.View, int, long)
*/
@
Override
protected void onListItemClick
(ListView l,
View v,
int position,
long id
)
{
Map map =
(Map) l.
getItemAtPosition(position
);
Intent intent =
(Intent
) map.
get("intent"); //$NON-NLS-1$
this.
startActivity(intent
);
}
}