@ -11,7 +11,6 @@ import android.content.ServiceConnection;
import android.content.res.TypedArray ;
import android.content.res.TypedArray ;
import android.database.MatrixCursor ;
import android.database.MatrixCursor ;
import android.net.Uri ;
import android.net.Uri ;
import android.os.AsyncTask ;
import android.os.Build ;
import android.os.Build ;
import android.os.Bundle ;
import android.os.Bundle ;
import android.os.Handler ;
import android.os.Handler ;
@ -57,21 +56,22 @@ import java.util.Deque;
import java.util.HashMap ;
import java.util.HashMap ;
import java.util.List ;
import java.util.List ;
import java.util.Map ;
import java.util.Map ;
import java.util.stream.Collectors ;
import awais.instagrabber.R ;
import awais.instagrabber.R ;
import awais.instagrabber.adapters.SuggestionsAdapter ;
import awais.instagrabber.adapters.SuggestionsAdapter ;
import awais.instagrabber.asyncs.PostFetcher ;
import awais.instagrabber.asyncs.PostFetcher ;
import awais.instagrabber.asyncs.SuggestionsFetcher ;
import awais.instagrabber.customviews.emoji.EmojiVariantManager ;
import awais.instagrabber.customviews.emoji.EmojiVariantManager ;
import awais.instagrabber.databinding.ActivityMainBinding ;
import awais.instagrabber.databinding.ActivityMainBinding ;
import awais.instagrabber.fragments.PostViewV2Fragment ;
import awais.instagrabber.fragments.PostViewV2Fragment ;
import awais.instagrabber.fragments.directmessages.DirectMessageInboxFragmentDirections ;
import awais.instagrabber.fragments.directmessages.DirectMessageInboxFragmentDirections ;
import awais.instagrabber.fragments.main.FeedFragment ;
import awais.instagrabber.fragments.main.FeedFragment ;
import awais.instagrabber.fragments.settings.PreferenceKeys ;
import awais.instagrabber.fragments.settings.PreferenceKeys ;
import awais.instagrabber.interfaces.FetchListener ;
import awais.instagrabber.models.IntentModel ;
import awais.instagrabber.models.IntentModel ;
import awais.instagrabber.models.SuggestionModel ;
import awais.instagrabber.models.SuggestionModel ;
import awais.instagrabber.models.enums.SuggestionType ;
import awais.instagrabber.models.enums.SuggestionType ;
import awais.instagrabber.repositories.responses.search.SearchItem ;
import awais.instagrabber.repositories.responses.search.SearchResponse ;
import awais.instagrabber.services.ActivityCheckerService ;
import awais.instagrabber.services.ActivityCheckerService ;
import awais.instagrabber.services.DMSyncAlarmReceiver ;
import awais.instagrabber.services.DMSyncAlarmReceiver ;
import awais.instagrabber.utils.AppExecutors ;
import awais.instagrabber.utils.AppExecutors ;
@ -83,6 +83,10 @@ import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.utils.Utils ;
import awais.instagrabber.utils.Utils ;
import awais.instagrabber.utils.emoji.EmojiParser ;
import awais.instagrabber.utils.emoji.EmojiParser ;
import awais.instagrabber.viewmodels.AppStateViewModel ;
import awais.instagrabber.viewmodels.AppStateViewModel ;
import awais.instagrabber.webservices.SearchService ;
import retrofit2.Call ;
import retrofit2.Callback ;
import retrofit2.Response ;
import static awais.instagrabber.utils.NavigationExtensions.setupWithNavController ;
import static awais.instagrabber.utils.NavigationExtensions.setupWithNavController ;
import static awais.instagrabber.utils.Utils.settingsHelper ;
import static awais.instagrabber.utils.Utils.settingsHelper ;
@ -105,6 +109,7 @@ public class MainActivity extends BaseLanguageActivity implements FragmentManage
private SuggestionsAdapter suggestionAdapter ;
private SuggestionsAdapter suggestionAdapter ;
private AutoCompleteTextView searchAutoComplete ;
private AutoCompleteTextView searchAutoComplete ;
private SearchView searchView ;
private SearchView searchView ;
private SearchService searchService ;
private boolean showSearch = true ;
private boolean showSearch = true ;
private Handler suggestionsFetchHandler ;
private Handler suggestionsFetchHandler ;
private int firstFragmentGraphIndex ;
private int firstFragmentGraphIndex ;
@ -175,6 +180,7 @@ public class MainActivity extends BaseLanguageActivity implements FragmentManage
EmojiVariantManager . getInstance ( ) ;
EmojiVariantManager . getInstance ( ) ;
} ) ;
} ) ;
initEmojiCompat ( ) ;
initEmojiCompat ( ) ;
searchService = SearchService . getInstance ( ) ;
/ / initDmService ( ) ;
/ / initDmService ( ) ;
}
}
@ -338,51 +344,84 @@ public class MainActivity extends BaseLanguageActivity implements FragmentManage
searchView . setOnQueryTextListener ( new SearchView . OnQueryTextListener ( ) {
searchView . setOnQueryTextListener ( new SearchView . OnQueryTextListener ( ) {
private boolean searchUser ;
private boolean searchUser ;
private boolean searchHash ;
private boolean searchHash ;
private AsyncTask < ? , ? , ? > prevSuggestionAsync ;
private Call < SearchResponse > prevSuggestionAsync ;
private final String [ ] COLUMNS = {
private final String [ ] COLUMNS = {
BaseColumns . _ID ,
BaseColumns . _ID ,
Constants . EXTRAS_USERNAME ,
Constants . EXTRAS_USERNAME ,
Constants . EXTRAS_NAME ,
Constants . EXTRAS_NAME ,
Constants . EXTRAS_TYPE ,
Constants . EXTRAS_TYPE ,
"query" ,
"pfp" ,
"pfp" ,
"verified"
"verified"
} ;
} ;
private String currentSearchQuery ;
private String currentSearchQuery ;
private final FetchListener < SuggestionModel [ ] > fetchListener = new FetchListener < SuggestionModel [ ] > ( ) {
private final Callback < SearchResponse > cb = new Callback < SearchResponse > ( ) {
@Override
@Override
public void doBefore ( ) {
public void onResponse ( @NonNull final Call < SearchResponse > call ,
suggestionAdapter . changeCursor ( null ) ;
@NonNull final Response < SearchResponse > response ) {
}
@Override
public void onResult ( final SuggestionModel [ ] result ) {
final MatrixCursor cursor ;
final MatrixCursor cursor ;
if ( result = = null ) cursor = null ;
final SearchResponse body = response . body ( ) ;
if ( body = = null ) {
cursor = null ;
return ;
}
final List < SearchItem > result = new ArrayList < SearchItem > ( ) ;
if ( isLoggedIn ) {
if ( body . getList ( ) ! = null ) result . addAll ( searchHash ? body . getList ( )
. stream ( )
. filter ( i - > i . getUser ( ) = = null )
. collect ( Collectors . toList ( ) ) : body . getList ( ) ) ;
}
else {
else {
if ( body . getUsers ( ) ! = null & & ! searchHash ) result . addAll ( body . getUsers ( ) ) ;
if ( body . getHashtags ( ) ! = null ) result . addAll ( body . getHashtags ( ) ) ;
if ( body . getPlaces ( ) ! = null ) result . addAll ( body . getPlaces ( ) ) ;
}
cursor = new MatrixCursor ( COLUMNS , 0 ) ;
cursor = new MatrixCursor ( COLUMNS , 0 ) ;
for ( int i = 0 ; i < result . length ; i + + ) {
for ( int i = 0 ; i < result . size ( ) ; i + + ) {
final SuggestionModel suggestionModel = result [ i ] ;
final SearchItem suggestionModel = result . get ( i ) ;
if ( suggestionModel ! = null ) {
if ( suggestionModel ! = null ) {
final SuggestionType suggestionType = suggestionModel . getSuggestionType ( ) ;
Object [ ] objects = null ;
final Object [ ] objects = {
if ( suggestionModel . getUser ( ) ! = null )
i ,
objects = new Object [ ] {
suggestionType = = SuggestionType . TYPE_LOCATION ? suggestionModel . getName ( ) : suggestionModel . getUsername ( ) ,
suggestionModel . getPosition ( ) ,
suggestionType = = SuggestionType . TYPE_LOCATION ? suggestionModel . getUsername ( ) : suggestionModel . getName ( ) ,
suggestionModel . getUser ( ) . getUsername ( ) ,
suggestionType ,
suggestionModel . getUser ( ) . getFullName ( ) ,
suggestionModel . getProfilePic ( ) ,
SuggestionType . TYPE_USER ,
suggestionModel . isVerified ( ) } ;
suggestionModel . getUser ( ) . getUsername ( ) ,
if ( ! searchHash & & ! searchUser ) cursor . addRow ( objects ) ;
suggestionModel . getUser ( ) . getProfilePicUrl ( ) ,
else {
suggestionModel . getUser ( ) . isVerified ( ) } ;
final boolean isCurrHash = suggestionType = = SuggestionType . TYPE_HASHTAG ;
else if ( suggestionModel . getHashtag ( ) ! = null )
if ( searchHash & & isCurrHash | | ! searchHash & & ! isCurrHash )
objects = new Object [ ] {
suggestionModel . getPosition ( ) ,
suggestionModel . getHashtag ( ) . getName ( ) ,
suggestionModel . getHashtag ( ) . getSubtitle ( ) ,
SuggestionType . TYPE_HASHTAG ,
suggestionModel . getHashtag ( ) . getName ( ) ,
"res:/" + R . drawable . ic_hashtag ,
false } ;
else if ( suggestionModel . getPlace ( ) ! = null )
objects = new Object [ ] {
suggestionModel . getPosition ( ) ,
suggestionModel . getPlace ( ) . getTitle ( ) ,
suggestionModel . getPlace ( ) . getSubtitle ( ) ,
SuggestionType . TYPE_LOCATION ,
suggestionModel . getPlace ( ) . getLocation ( ) . getPk ( ) ,
"res:/" + R . drawable . ic_location ,
false } ;
cursor . addRow ( objects ) ;
cursor . addRow ( objects ) ;
}
}
}
}
}
}
suggestionAdapter . changeCursor ( cursor ) ;
suggestionAdapter . changeCursor ( cursor ) ;
}
}
@Override
public void onFailure ( @NonNull final Call < SearchResponse > call ,
Throwable t ) {
if ( ! call . isCanceled ( ) & & t ! = null )
Log . e ( TAG , "Exception on search:" , t ) ;
}
} ;
} ;
private final Runnable runnable = ( ) - > {
private final Runnable runnable = ( ) - > {
@ -401,17 +440,19 @@ public class MainActivity extends BaseLanguageActivity implements FragmentManage
if ( searchAutoComplete ! = null ) {
if ( searchAutoComplete ! = null ) {
searchAutoComplete . setThreshold ( 1 ) ;
searchAutoComplete . setThreshold ( 1 ) ;
}
}
prevSuggestionAsync = new SuggestionsFetcher ( fetchListener ) . executeOnExecutor (
prevSuggestionAsync = searchService . search ( isLoggedIn ,
AsyncTask . THREAD_POOL_EXECUTOR ,
searchUser | | searchHash ? currentSearchQuery . substring ( 1 )
searchUser | | searchHash ? currentSearchQuery . substring ( 1 )
: currentSearchQuery ) ;
: currentSearchQuery ,
searchUser ? "user" : ( searchHash ? "hashtag" : "blended" ) ) ;
suggestionAdapter . changeCursor ( null ) ;
prevSuggestionAsync . enqueue ( cb ) ;
}
}
} ;
} ;
private void cancelSuggestionsAsync ( ) {
private void cancelSuggestionsAsync ( ) {
if ( prevSuggestionAsync ! = null )
if ( prevSuggestionAsync ! = null )
try {
try {
prevSuggestionAsync . cancel ( true ) ;
prevSuggestionAsync . cancel ( ) ;
} catch ( final Exception ignored ) { }
} catch ( final Exception ignored ) { }
}
}
xxxxxxxxxx