@ -4,7 +4,10 @@ import android.arch.lifecycle.LiveData;
 
			
		
	
		
		
			
				
					
					import  android.arch.lifecycle.MutableLiveData ; import  android.arch.lifecycle.MutableLiveData ;  
			
		
	
		
		
			
				
					
					import  android.arch.lifecycle.ViewModel ; import  android.arch.lifecycle.ViewModel ;  
			
		
	
		
		
			
				
					
					import  android.arch.lifecycle.ViewModelProvider ; import  android.arch.lifecycle.ViewModelProvider ;  
			
		
	
		
		
			
				
					
					import  android.database.ContentObserver ;  
			
		
	
		
		
			
				
					
					import  android.os.Handler ;  
			
		
	
		
		
			
				
					
					import  android.support.annotation.NonNull ; import  android.support.annotation.NonNull ;  
			
		
	
		
		
			
				
					
					import  android.text.TextUtils ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					import  org.thoughtcrime.securesms.search.model.SearchResult ; import  org.thoughtcrime.securesms.search.model.SearchResult ;  
			
		
	
		
		
			
				
					
					import  org.thoughtcrime.securesms.util.Debouncer ; import  org.thoughtcrime.securesms.util.Debouncer ;  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -19,16 +22,25 @@ import org.thoughtcrime.securesms.util.Debouncer;
 
			
		
	
		
		
			
				
					
					 * / 
 * / 
 
			
		
	
		
		
			
				
					
					class  SearchViewModel  extends  ViewModel  { class  SearchViewModel  extends  ViewModel  {  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  private  final  ClosingLiveData   searchResult ; 
  private  final  ObservingLiveData  searchResult ; 
 
			
				
				
			
		
	
		
		
			
				
					
					  private  final  SearchRepository  searchRepository ; 
  private  final  SearchRepository    searchRepository ; 
 
			
				
				
			
		
	
		
		
			
				
					
					  private  final  Debouncer         debouncer ; 
  private  final  Debouncer           debouncer ; 
 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  private  String  lastQuery ; 
  private  String  lastQuery ; 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  SearchViewModel ( @NonNull  SearchRepository  searchRepository )  { 
  SearchViewModel ( @NonNull  SearchRepository  searchRepository )  { 
 
			
		
	
		
		
			
				
					
					    this . searchResult      =  new  Clos ingLiveData( ) ; 
    this . searchResult      =  new  Observ ingLiveData( ) ; 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					    this . searchRepository  =  searchRepository ; 
    this . searchRepository  =  searchRepository ; 
 
			
		
	
		
		
			
				
					
					    this . debouncer         =  new  Debouncer ( 500 ) ; 
    this . debouncer         =  new  Debouncer ( 500 ) ; 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    searchResult . registerContentObserver ( new  ContentObserver ( new  Handler ( ) )  { 
 
			
		
	
		
		
			
				
					
					      @Override 
 
			
		
	
		
		
			
				
					
					      public  void  onChange ( boolean  selfChange )  { 
 
			
		
	
		
		
			
				
					
					        if  ( ! TextUtils . isEmpty ( getLastQuery ( ) ) )  { 
 
			
		
	
		
		
			
				
					
					          searchRepository . query ( getLastQuery ( ) ,  searchResult : : postValue ) ; 
 
			
		
	
		
		
			
				
					
					        } 
 
			
		
	
		
		
			
				
					
					      } 
 
			
		
	
		
		
			
				
					
					    } ) ; 
 
			
		
	
		
		
			
				
					
					  } 
  } 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  LiveData < SearchResult >  getSearchResult ( )  { 
  LiveData < SearchResult >  getSearchResult ( )  { 
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -54,23 +66,36 @@ class SearchViewModel extends ViewModel {
 
			
		
	
		
		
			
				
					
					  / * * 
  / * * 
 
			
		
	
		
		
			
				
					
					   *  Ensures  that  the  previous  { @link  SearchResult }  is  always  closed  whenever  we  set  a  new  one . 
   *  Ensures  that  the  previous  { @link  SearchResult }  is  always  closed  whenever  we  set  a  new  one . 
 
			
		
	
		
		
			
				
					
					   * / 
   * / 
 
			
		
	
		
		
			
				
					
					  private  static  class  ClosingLiveData  extends  MutableLiveData < SearchResult >  { 
  private  static  class  ObservingLiveData  extends  MutableLiveData < SearchResult >  { 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    private  ContentObserver  observer ; 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    @Override 
    @Override 
 
			
		
	
		
		
			
				
					
					    public  void  setValue ( SearchResult  value )  { 
    public  void  setValue ( SearchResult  value )  { 
 
			
		
	
		
		
			
				
					
					      SearchResult  previous  =  getValue ( ) ; 
      SearchResult  previous  =  getValue ( ) ; 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					      if  ( previous  ! =  null )  { 
      if  ( previous  ! =  null )  { 
 
			
		
	
		
		
			
				
					
					        previous . unregisterContentObserver ( observer ) ; 
 
			
		
	
		
		
			
				
					
					        previous . close ( ) ; 
        previous . close ( ) ; 
 
			
		
	
		
		
			
				
					
					      } 
      } 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					      value . registerContentObserver ( observer ) ; 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					      super . setValue ( value ) ; 
      super . setValue ( value ) ; 
 
			
		
	
		
		
			
				
					
					    } 
    } 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    public  void  close ( )  { 
    void  close ( )  { 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					      SearchResult  value  =  getValue ( ) ; 
      SearchResult  value  =  getValue ( ) ; 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					      if  ( value  ! =  null )  { 
      if  ( value  ! =  null )  { 
 
			
		
	
		
		
			
				
					
					        value . unregisterContentObserver ( observer ) ; 
 
			
		
	
		
		
			
				
					
					        value . close ( ) ; 
        value . close ( ) ; 
 
			
		
	
		
		
			
				
					
					      } 
      } 
 
			
		
	
		
		
			
				
					
					    } 
    } 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    void  registerContentObserver ( @NonNull  ContentObserver  observer )  { 
 
			
		
	
		
		
			
				
					
					      this . observer  =  observer ; 
 
			
		
	
		
		
			
				
					
					    } 
 
			
		
	
		
		
			
				
					
					  } 
  } 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  public  static  class  Factory  extends  ViewModelProvider . NewInstanceFactory  { 
  public  static  class  Factory  extends  ViewModelProvider . NewInstanceFactory  {