/******************************************************************************* * Copyright 2009 Robot Media SL * * 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. ******************************************************************************/ package net.robotmedia.acv.ui; import java.io.File; import java.io.FilenameFilter; import java.util.*; import net.androidcomics.acv.R; import net.robotmedia.acv.Constants; import net.robotmedia.acv.logic.AdsManager; import net.robotmedia.acv.logic.PreferencesController; import net.robotmedia.acv.provider.HistoryManager; import net.robotmedia.acv.utils.FileUtils; import android.app.*; import android.content.*; import android.os.Bundle; import android.os.Environment; import android.view.*; import android.widget.*; import android.widget.TabHost.OnTabChangeListener; public class SDBrowserActivity extends TabActivity { private static final int NO_SD = 3; private static final String TAB_BROWSER = "tab_browser"; private static final String TAB_RECENT = "tab_recent"; private File currentDirectory; private static HashMap<String, Integer> supportedExtensions = null; private TabHost tabHost; private FrameLayout tabBrowser, tabRecent; private ListView browserListView; private ListView recentListView; private LayoutInflater mInflater; private PreferencesController preferencesController; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); supportedExtensions = Constants.getSupportedExtensions(this); preferencesController = new PreferencesController(this); setContentView(R.layout.sd_browser); mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); tabHost = getTabHost(); tabBrowser = (FrameLayout) findViewById(R.id.sdBrowserTabBrowser); tabRecent = (FrameLayout) findViewById(R.id.sdBrowserTabRecent); tabHost.addTab(tabHost.newTabSpec(TAB_BROWSER).setIndicator(getIndicator(R.string.sd_browser_open)) .setContent(R.id.sdBrowserTabBrowser)); tabHost.addTab(tabHost.newTabSpec(TAB_RECENT).setIndicator(getIndicator(R.string.sd_browser_recent)) .setContent(R.id.sdBrowserTabRecent)); tabHost.setCurrentTab(0); tabHost.setOnTabChangedListener(new OnTabChangeListener() { @Override public void onTabChanged(String tabId) { if (tabId.contentEquals(TAB_RECENT)) { setTitle(""); } else { setTitle(currentDirectory.getName()); } } }); String storageState = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(storageState)) { // Setup file list Intent intent = getIntent(); String comicsPath = intent.getStringExtra(Constants.COMICS_PATH_KEY); File directory; if (comicsPath != null) { // TODO simplify directory = new File(comicsPath); if (!directory.isDirectory()) { directory = Environment.getExternalStorageDirectory(); } } else { directory = Environment.getExternalStorageDirectory(); } browserListView = (ListView) tabBrowser.findViewById(android.R.id.list); browserListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { File file = (File) parent.getItemAtPosition(position); if ((file != null) && (file.isDirectory())) { String[] images = file.list(new FilenameFilter() { public boolean accept(File dir, String filename) { String ext = FileUtils.getFileExtension(filename); return FileUtils.isImage(ext); } }); if (images.length > 0) { setResultAndFinish(file); return true; } } return false; } }); browserListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { File file = (File) parent.getItemAtPosition(position); if(file == null) { return; } if (file.isDirectory()) { changeDirectory(file); } else if (file.exists()) { setResultAndFinish(file); } } }); changeDirectory(directory); // Setup recent items list recentListView = (ListView) tabRecent.findViewById(android.R.id.list); recentListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { File file = new File((String) parent.getItemAtPosition(position)); if (file.exists()) { setResultAndFinish(file); } } }); recentListView.setAdapter(new RecentListAdapter(this, R.layout.sd_item_empty)); // Ads View ad = AdsManager.getAd(this); if(ad != null) { ViewGroup adsContainer = (ViewGroup) findViewById(R.id.adsContainer); adsContainer.addView(ad); } } else { showDialog(NO_SD); } } private void changeDirectory(File directory) { currentDirectory = directory; this.setTitle(directory.getName()); preferencesController.savePreference(Constants.COMICS_PATH_KEY, directory.getAbsolutePath()); browserListView.setAdapter(new ListAdapter(SDBrowserActivity.this, directory, R.layout.sd_item_empty)); } protected ViewGroup getIndicator(int resourceId) { return getIndicator(getString(resourceId)); } protected ViewGroup getIndicator(String text) { ViewGroup indicator = (ViewGroup) mInflater.inflate(R.layout.sd_browser_tab, null); TextView label = (TextView) indicator.findViewById(R.id.sd_browser_tab_title); label.setText(text); // TODO custom font return indicator; } @Override protected Dialog onCreateDialog(int id) { switch (id) { case NO_SD: return new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_menu_info_details).setTitle(R.string.dialog_no_sd_title) .setMessage(R.string.dialog_no_sd_text).setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { SDBrowserActivity.this.setResult(RESULT_CANCELED); SDBrowserActivity.this.finish(); } }).create(); } return null; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { int code = event.getKeyCode(); if (code == KeyEvent.KEYCODE_BACK) { finish(); } return super.onKeyDown(keyCode, event); } private void setResultAndFinish(File file) { Intent result = new Intent(); String absolutePath = file.getAbsolutePath(); result.putExtra(Constants.COMIC_PATH_KEY, absolutePath); setResult(RESULT_OK, result); finish(); } public class ListAdapter extends BaseAdapter { ArrayList<File> contents = new ArrayList<File>(); private File current; private View emptyView; private boolean isEmpty; public ListAdapter(Context context, File current, int emptyResourceId) { this.current = current; if (emptyResourceId != 0) { LayoutInflater inflater = getLayoutInflater(); emptyView = inflater.inflate(emptyResourceId, null); } else { TextView t = new TextView(context); t.setText(R.string.sd_browser_empty); emptyView = t; } filterContents(); } private void filterContents() { String[] allContents = current.list(); TreeMap<String, File> filteredContents = new TreeMap<String, File>(); contents = new ArrayList<File>(); File parent = current.getParentFile(); if (parent != null) { contents.add(parent); } if (allContents != null) { String path = current.getPath(); for (int i = 0; i < allContents.length; i++) { String contentName = allContents[i]; if (contentName.indexOf(".") != 0) { // Exclude hidden files String extension = FileUtils.getFileExtension(contentName); if (supportedExtensions.containsKey(extension.toLowerCase())) { File contentFile = new File(path, contentName); filteredContents.put(contentFile.getName().toLowerCase(), contentFile); } else { File contentFile = new File(path, contentName); if (contentFile.isDirectory()) { filteredContents.put(contentFile.getName().toLowerCase(), contentFile); } } } } } isEmpty = (filteredContents.size() == 0); contents.addAll(filteredContents.values()); } public int getCount() { if (isEmpty) { return contents.size() + 1; } else { return contents.size(); } } public File getItem(int position) { if (position < contents.size()) { return contents.get(position); } else { return null; } } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { // First element if (position == 0 && current.getParent() != null) { TextView textView = (TextView) mInflater.inflate(android.R.layout.simple_list_item_1, parent, false); textView.setText(R.string.sd_browser_back); textView.setTag("back"); return textView; } else { if (isEmpty) { return emptyView; } ViewHolder holder; if (convertView == null || !(convertView.getTag() instanceof ViewHolder)) { convertView = mInflater.inflate(R.layout.sd_item, parent, false); holder = new ViewHolder(); holder.icon = (ImageView) convertView.findViewById(R.id.sd_item_icon); holder.name = (TextView) convertView.findViewById(R.id.sd_item_name); holder.size = (TextView) convertView.findViewById(R.id.sd_item_size); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } File file = contents.get(position); String name = file.getName(); String extension = FileUtils.getFileExtension(name); int iconId; if (supportedExtensions.containsKey(extension)) { iconId = supportedExtensions.get(extension); } else { iconId = R.drawable.folder; } holder.icon.setImageResource(iconId); holder.name.setText(name); if (file.isDirectory()) { holder.size.setVisibility(View.GONE); } else { holder.size.setVisibility(View.VISIBLE); long size = file.length() / 1024; holder.size.setText(String.valueOf(size) + " KB"); } return convertView; } } } // TODO refactor both list adapters public class RecentListAdapter extends BaseAdapter { ArrayList<String> contents = new ArrayList<String>(); private View emptyView; private boolean isEmpty; public RecentListAdapter(Context context, int emptyResourceId) { if (emptyResourceId != 0) { LayoutInflater inflater = getLayoutInflater(); emptyView = inflater.inflate(emptyResourceId, null); } else { TextView t = new TextView(context); t.setText(R.string.sd_browser_empty); emptyView = t; } populate(); } private void populate() { contents.clear(); List<String> lastFiles = HistoryManager.getInstance(SDBrowserActivity.this).getRecentFiles(); contents.addAll(lastFiles); } public int getCount() { return contents.size(); } public String getItem(int position) { return contents.get(position); } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { if (isEmpty) { return emptyView; } ViewHolder holder; if (convertView == null || !(convertView.getTag() instanceof ViewHolder)) { convertView = mInflater.inflate(R.layout.sd_item, parent, false); holder = new ViewHolder(); holder.icon = (ImageView) convertView.findViewById(R.id.sd_item_icon); holder.name = (TextView) convertView.findViewById(R.id.sd_item_name); holder.size = (TextView) convertView.findViewById(R.id.sd_item_size); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } File file = new File(contents.get(position)); String name = file.getName(); String extension = FileUtils.getFileExtension(name); int iconId; if (supportedExtensions.containsKey(extension)) { iconId = supportedExtensions.get(extension); } else { iconId = R.drawable.folder; } holder.icon.setImageResource(iconId); holder.name.setText(name); if (file.isDirectory()) { holder.size.setVisibility(View.GONE); } else { holder.size.setVisibility(View.VISIBLE); long size = file.length() / 1024; holder.size.setText(String.valueOf(size) + " KB"); } return convertView; } } static class ViewHolder { ImageView icon; TextView name; TextView size; } }