4040import android .view .ViewGroup .LayoutParams ;
4141import android .widget .AdapterView ;
4242import android .widget .AdapterView .OnItemLongClickListener ;
43- import android .widget .ArrayAdapter ;
43+ import android .widget .BaseAdapter ;
4444import android .widget .ImageView ;
4545import android .widget .ListView ;
4646import android .widget .RelativeLayout ;
9191import java .io .IOException ;
9292import java .net .NoRouteToHostException ;
9393import java .util .ArrayList ;
94+ import java .util .List ;
95+ import java .util .Observable ;
96+ import java .util .Observer ;
9497
9598import static org .csploit .android .services .UpdateChecker .UPDATE_AVAILABLE ;
9699import static org .csploit .android .services .UpdateChecker .UPDATE_CHECKING ;
@@ -180,7 +183,7 @@ public void createOnlineLayout() {
180183 lv .setOnItemLongClickListener (new OnItemLongClickListener () {
181184 @ Override
182185 public boolean onItemLongClick (AdapterView <?> parent , View view , int position , long id ) {
183- Target t = System . getTarget (position );
186+ Target t = ( Target ) mTargetAdapter . getItem (position );
184187 if (t .getType () == Target .Type .NETWORK ) {
185188 if (mActionMode == null )
186189 targetAliasPrompt (t );
@@ -200,7 +203,7 @@ public boolean onItemLongClick(AdapterView<?> parent, View view, int position, l
200203 mWipeReceiver .register (MainActivity .this );
201204 mMsfReceiver .register (MainActivity .this );
202205
203- mRadarReceiver .setTargetAdapter (mTargetAdapter );
206+ mRadarReceiver .setObserver (mTargetAdapter );
204207
205208 StartRPCServer ();
206209
@@ -317,6 +320,9 @@ public void onItemClick(AdapterView<?> parent, View view, int position, long id)
317320 return ;
318321 }
319322
323+ Target target = (Target ) mTargetAdapter .getItem (position );
324+ System .setCurrentTarget (target );
325+
320326 new Thread (new Runnable () {
321327 @ Override
322328 public void run () {
@@ -329,7 +335,6 @@ public void run() {
329335 }
330336 }).start ();
331337
332- System .setCurrentTarget (position );
333338 Toast .makeText (MainActivity .this ,
334339 getString (R .string .selected_ ) + System .getCurrentTarget (),
335340 Toast .LENGTH_SHORT ).show ();
@@ -497,9 +502,11 @@ public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
497502 case R .id .multi_action :
498503 final int [] selected = mTargetAdapter .getSelectedPositions ();
499504 if (selected .length > 1 ) {
500- commonPlugins = System .getPluginsForTarget (System .getTarget (selected [0 ]));
505+ Target target = (Target ) mTargetAdapter .getItem (selected [0 ]);
506+ commonPlugins = System .getPluginsForTarget (target );
501507 for (int i = 1 ; i < selected .length ; i ++) {
502- ArrayList <Plugin > targetPlugins = System .getPluginsForTarget (System .getTarget (selected [i ]));
508+ target = (Target ) mTargetAdapter .getItem (selected [i ]);
509+ ArrayList <Plugin > targetPlugins = System .getPluginsForTarget (target );
503510 ArrayList <Plugin > removeThem = new ArrayList <Plugin >();
504511 for (Plugin p : commonPlugins ) {
505512 if (!targetPlugins .contains (p ))
@@ -533,7 +540,7 @@ public void onChoice(int[] choices) {
533540 (new ErrorDialog (getString (R .string .error ), "no common actions found" , MainActivity .this )).show ();
534541 }
535542 } else {
536- targetAliasPrompt (System . getTarget (selected [0 ]));
543+ targetAliasPrompt (( Target ) mTargetAdapter . getItem (selected [0 ]));
537544 }
538545 mode .finish (); // Action picked, so close the CAB
539546 return true ;
@@ -817,14 +824,24 @@ public void onDestroy() {
817824 super .onDestroy ();
818825 }
819826
820- public class TargetAdapter extends ArrayAdapter < Target > {
821- public TargetAdapter () {
822- super ( MainActivity . this , R . layout . target_list_item );
823- }
827+ public class TargetAdapter extends BaseAdapter implements Runnable , Observer {
828+
829+ private List < Target > list = System . getTargets ( );
830+ private boolean isDark = getSharedPreferences ( "THEME" , 0 ). getBoolean ( "isDark" , false );
824831
825832 @ Override
826833 public int getCount () {
827- return System .getTargets ().size ();
834+ return list .size ();
835+ }
836+
837+ @ Override
838+ public Object getItem (int position ) {
839+ return list .get (position );
840+ }
841+
842+ @ Override
843+ public long getItemId (int position ) {
844+ return R .layout .target_list_item ;
828845 }
829846
830847 @ Override
@@ -835,24 +852,21 @@ public View getView(int position, View convertView, ViewGroup parent) {
835852 if (row == null ) {
836853 LayoutInflater inflater = (LayoutInflater ) MainActivity .this
837854 .getSystemService (Context .LAYOUT_INFLATER_SERVICE );
838- row = inflater
839- . inflate ( R . layout . target_list_item , parent , false );
840- if (getSharedPreferences ( "THEME" , 0 ). getBoolean ( " isDark" , false ) )
855+ row = inflater . inflate ( R . layout . target_list_item , parent , false );
856+
857+ if (isDark )
841858 row .setBackgroundResource (R .drawable .card_background_dark );
859+
842860 holder = new TargetHolder ();
843- holder .itemImage = (ImageView ) (row != null ? row
844- .findViewById (R .id .itemIcon ) : null );
845- holder .itemTitle = (TextView ) (row != null ? row
846- .findViewById (R .id .itemTitle ) : null );
847- holder .itemDescription = (TextView ) (row != null ? row
848- .findViewById (R .id .itemDescription ) : null );
849-
850- if (row != null )
851- row .setTag (holder );
861+ holder .itemImage = (ImageView ) row .findViewById (R .id .itemIcon );
862+ holder .itemTitle = (TextView ) row .findViewById (R .id .itemTitle );
863+ holder .itemDescription = (TextView ) row .findViewById (R .id .itemDescription );
864+
865+ row .setTag (holder );
852866 } else
853867 holder = (TargetHolder ) row .getTag ();
854868
855- Target target = System . getTarget (position );
869+ Target target = list . get (position );
856870
857871 if (target .hasAlias ())
858872 holder .itemTitle .setText (Html .fromHtml ("<b>"
@@ -864,8 +878,6 @@ public View getView(int position, View convertView, ViewGroup parent) {
864878
865879 holder .itemTitle .setTextColor (getResources ().getColor ((target .isConnected () ? R .color .app_color : R .color .gray_text )));
866880
867- if (row != null && (getSharedPreferences ("THEME" , 0 ).getBoolean ("isDark" , false )))
868- row .setBackgroundResource (R .drawable .card_background_dark );
869881 holder .itemTitle .setTypeface (null , Typeface .NORMAL );
870882 holder .itemImage .setImageResource (target .getDrawableResourceId ());
871883 holder .itemDescription .setText (target .getDescription ());
@@ -874,15 +886,15 @@ public View getView(int position, View convertView, ViewGroup parent) {
874886 }
875887
876888 public void clearSelection () {
877- for (Target t : System . getTargets () )
889+ for (Target t : list )
878890 t .setSelected (false );
879891 notifyDataSetChanged ();
880892 if (mActionMode != null )
881893 mActionMode .finish ();
882894 }
883895
884896 public void toggleSelection (int position ) {
885- Target t = System . getTarget (position );
897+ Target t = list . get (position );
886898 t .setSelected (!t .isSelected ());
887899 notifyDataSetChanged ();
888900 if (mActionMode != null ) {
@@ -895,15 +907,15 @@ public void toggleSelection(int position) {
895907
896908 public int getSelectedCount () {
897909 int i = 0 ;
898- for (Target t : System . getTargets () )
910+ for (Target t : list )
899911 if (t .isSelected ())
900912 i ++;
901913 return i ;
902914 }
903915
904916 public ArrayList <Target > getSelected () {
905917 ArrayList <Target > result = new ArrayList <Target >();
906- for (Target t : System . getTargets () )
918+ for (Target t : list )
907919 if (t .isSelected ())
908920 result .add (t );
909921 return result ;
@@ -913,12 +925,23 @@ public int[] getSelectedPositions() {
913925 int [] res = new int [getSelectedCount ()];
914926 int j = 0 ;
915927
916- for (int i = 0 ; i < System . getTargets () .size (); i ++)
917- if (System . getTarget (i ).isSelected ())
928+ for (int i = 0 ; i < list .size (); i ++)
929+ if (list . get (i ).isSelected ())
918930 res [j ++] = i ;
919931 return res ;
920932 }
921933
934+ @ Override
935+ public void update (Observable observable , Object data ) {
936+ MainActivity .this .runOnUiThread (this );
937+ }
938+
939+ @ Override
940+ public void run () {
941+ list = System .getTargets ();
942+ notifyDataSetChanged ();
943+ }
944+
922945 class TargetHolder {
923946 ImageView itemImage ;
924947 TextView itemTitle ;
0 commit comments