package com.ghostsq.commander.adapters;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import com.ghostsq.commander.Commander;
import com.ghostsq.commander.R;
import com.ghostsq.commander.adapters.CommanderAdapter;
import com.ghostsq.commander.adapters.CommanderAdapterBase;
import com.ghostsq.commander.adapters.Engines.IReciever;
import com.ghostsq.commander.favorites.Favorite;
import com.ghostsq.commander.favorites.FavDialog;
import com.ghostsq.commander.utils.Credentials;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Parcelable;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.ContextMenu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
public class FavsAdapter extends CommanderAdapterBase {
private final static String TAG = "FavsAdapter";
private final static int CREATE_FAVE_SHORTCUT = 3423;
private ArrayList<Favorite> favs;
public FavsAdapter( Context ctx_ ) {
super( ctx_, DETAILED_MODE | NARROW_MODE | SHOW_ATTR | ATTR_ONLY );
numItems = 0;
favs = null;
numItems = 1;
}
public void setFavorites( ArrayList<Favorite> favs_ ) {
favs = favs_;
numItems = favs.size() + 1;
}
@Override
public int setMode( int mask, int val ) {
if( ( mask & ( MODE_WIDTH | MODE_DETAILS | MODE_ATTR ) ) == 0 )
super.setMode( mask, val );
return mode;
}
@Override
public int getType() {
return CA.FAVS;
}
@Override
public String toString() {
return "favs:";
}
/*
* CommanderAdapter implementation
*/
@Override
public Uri getUri() {
return Uri.parse( toString() );
}
@Override
public void setUri( Uri uri ) {
}
@Override
public boolean readSource( Uri tmp_uri, String pbod ) {
numItems = favs.size() + 1;
notifyDataSetChanged();
notify( pbod );
return true;
}
@Override
public void populateContextMenu( ContextMenu menu, AdapterView.AdapterContextMenuInfo acmi, int num ) {
if( num <= 1 ) {
menu.add( 0, Commander.OPEN, 0, s( R.string.go_button ) );
menu.add( 0, R.id.F2, 0, s( R.string.rename_title ) );
menu.add( 0, R.id.F4, 0, s( R.string.edit_title ) );
menu.add( 0, R.id.F8, 0, s( R.string.delete_title ) );
menu.add( 0, CREATE_FAVE_SHORTCUT, 0, s( R.string.shortcut ) );
}
}
@Override
public void reqItemsSize( SparseBooleanArray cis ) {
notErr();
}
@Override
public boolean copyItems( SparseBooleanArray cis, CommanderAdapter to, boolean move ) {
return notErr();
}
@Override
public boolean createFile( String fileURI ) {
return notErr();
}
@Override
public void createFolder( String new_name ) {
notErr();
}
@Override
public boolean deleteItems( SparseBooleanArray cis ) {
ArrayList<Favorite> favs_to_remove = new ArrayList<Favorite>( numItems-1 );
for( int i = 0; i < cis.size(); i++ )
if( cis.valueAt( i ) ) {
int k = cis.keyAt( i );
if( k > 0 ) {
favs_to_remove.add( favs.get( k - 1 ) );
}
}
for( int i = 0; i < favs_to_remove.size(); i++ )
favs.remove( favs_to_remove.get( i ) );
numItems = favs.size() + 1;
notifyDataSetChanged();
notify( Commander.OPERATION_COMPLETED );
return true;
}
@Override
public void openItem( int position ) {
if( position == 0 ) {
commander.Navigate( Uri.parse( "home:" ), null, null );
return;
}
if( favs == null || position < 0 || position > numItems )
return;
Favorite f = favs.get( position - 1 );
if( f != null )
commander.Navigate( f.getUri(), f.getCredentials(), null );
}
@Override
public boolean receiveItems( String[] full_names, int move_mode ) {
return notErr();
}
@Override
public boolean renameItem( int p, String newName, boolean c ) {
if( favs != null && p > 0 && p <= favs.size() ) {
favs.get( p-1 ).setComment( newName );
notifyDataSetChanged();
return true;
}
return false;
}
@Override
public void doIt( int command_id, SparseBooleanArray cis ) {
if( CREATE_FAVE_SHORTCUT == command_id ) {
int k = 0, n = favs.size();
for( int i = 0; i < cis.size(); i++ ) {
k = cis.keyAt( i );
if( cis.valueAt( i ) && k > 0 && k <= n )
break;
}
if( k > 0 )
createDesktopShortcut( favs.get( k - 1 ) );
}
}
public void editItem( int p ) {
if( favs != null && p > 0 && p <= favs.size() ) {
new FavDialog( ctx, favs.get( p-1 ), this );
}
}
public void invalidate() {
notifyDataSetChanged();
notify( Commander.OPERATION_COMPLETED );
}
private final void createDesktopShortcut( Favorite f ) {
if( f == null ) return;
Uri uri = f.getUri();
Intent shortcutIntent = new Intent();
shortcutIntent.setClassName( ctx, commander.getClass().getName() );
shortcutIntent.setAction( Intent.ACTION_VIEW );
shortcutIntent.setData( uri );
Credentials crd = f.getCredentials();
if( crd != null )
shortcutIntent.putExtra( Credentials.KEY, crd );
Intent intent = new Intent();
intent.putExtra( Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent );
String name = f.getComment();
if( name == null || name.length() == 0 )
name = f.getUriString( true );
intent.putExtra( Intent.EXTRA_SHORTCUT_NAME, name );
Parcelable iconResource = Intent.ShortcutIconResource.fromContext( ctx, getDrawableIconId( uri ) );
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);
intent.setAction( "com.android.launcher.action.INSTALL_SHORTCUT" );
ctx.sendBroadcast( intent );
}
private final int getDrawableIconId( Uri uri ) {
if( uri != null ) {
String sch = uri.getScheme();
if( sch != null && sch.length() != 0 ) {
int t_id = CA.GetAdapterTypeId( sch );
if( CA.ZIP == t_id ) return R.drawable.zip; else
if( CA.FTP == t_id ) return R.drawable.server; else
if( CA.SFTP == t_id ) return R.drawable.server; else
if( CA.SMB == t_id ) return R.drawable.smb; else
if( CA.ROOT == t_id ) return R.drawable.root; else
if( CA.MNT == t_id ) return R.drawable.mount; else
if( CA.HOME == t_id ) return R.drawable.icon; else
if( CA.APPS == t_id ) return R.drawable.android; else
return R.drawable.folder;
}
}
return R.drawable.folder;
}
@Override
public String getItemName( int p, boolean full ) {
if( favs != null && p > 0 && p <= favs.size() ) {
Favorite f = favs.get( p - 1 );
String comm = f.getComment();
return comm != null && comm.length() > 0 ? comm : full ? f.getUriString( true ) : "";
}
return null;
}
/*
* BaseAdapter implementation
*/
@Override
public Object getItem( int position ) {
Item item = new Item();
if( position == 0 ) {
item = new Item();
item.name = parentLink;
item.dir = true;
}
else {
if( favs != null && position > 0 && position <= favs.size() ) {
Favorite f = favs.get( position - 1 );
if( f != null ) {
item.dir = false;
item.name = f.getUriString( true );
item.size = -1;
item.sel = false;
item.date = null;
item.attr = f.getComment();
item.icon_id = getDrawableIconId( f.getUri() );
}
}
}
return item;
}
@Override
protected void reSort() {
if( favs == null ) return;
FavoriteComparator comp = new FavoriteComparator( mode & MODE_SORTING, (mode & MODE_CASE) != 0, ascending );
Collections.sort( favs, comp );
}
public class FavoriteComparator implements Comparator<Favorite> {
int type;
boolean case_ignore, ascending;
public FavoriteComparator( int type_, boolean case_ignore_, boolean ascending_ ) {
type = type_;
case_ignore = case_ignore_;
ascending = ascending_;
}
public int compare( Favorite f1, Favorite f2 ) {
if( f1 == null || f2 == null ) {
Log.w( TAG, "a Fav is null!" );
return 0;
}
int ext_cmp = 0;
switch( type ) {
case SORT_EXT: {
String c1 = f1.getComment();
if( c1 == null ) c1 = "";
String c2 = f2.getComment();
if( c2 == null ) c2 = "";
ext_cmp = c1.compareTo( c2 );
}
break;
case SORT_SIZE: {
ext_cmp = getWeight( f1.getUri() ) - getWeight( f2.getUri() ) > 0 ? 1 : -1;
}
break;
case SORT_DATE:
break;
}
if( ext_cmp == 0 ) {
Uri u1 = f1.getUri();
Uri u2 = f2.getUri();
if( u1 != null )
ext_cmp = u1.compareTo( u2 );
}
return ascending ? ext_cmp : -ext_cmp;
}
private int getWeight( Uri u ) {
int w = 0;
if( u != null ) {
w++;
String s = u.getScheme();
if( s != null ) {
w++;
if( "ftp".equals( s ) ) w++; else
if( "smb".equals( s ) ) w+=2;
}
}
return w;
}
}
}