|  |  |  | @ -150,15 +150,28 @@ public class CameraOrchestrator { | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public void remove(@NonNull String name) { | 
			
		
	
		
			
				
					|  |  |  |  |         trim(name, 0); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public void trim(@NonNull String name, int allowed) { | 
			
		
	
		
			
				
					|  |  |  |  |         synchronized (mLock) { | 
			
		
	
		
			
				
					|  |  |  |  |             if (mDelayedJobs.get(name) != null) { | 
			
		
	
		
			
				
					|  |  |  |  |             Token token = new Token(name, Tasks.forResult(null)); | 
			
		
	
		
			
				
					|  |  |  |  |             int scheduled = 0; | 
			
		
	
		
			
				
					|  |  |  |  |             for (Token job : mJobs) { | 
			
		
	
		
			
				
					|  |  |  |  |                 if (job == token) scheduled++; | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |             boolean delayed = mDelayedJobs.containsKey(name); | 
			
		
	
		
			
				
					|  |  |  |  |             if (delayed) scheduled++; | 
			
		
	
		
			
				
					|  |  |  |  |             int existing = Math.max(scheduled - allowed, 0); | 
			
		
	
		
			
				
					|  |  |  |  |             while (existing > 0 && mJobs.removeLastOccurrence(token)) { | 
			
		
	
		
			
				
					|  |  |  |  |                 existing--; | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |             if (existing > 0 && delayed) { | 
			
		
	
		
			
				
					|  |  |  |  |                 //noinspection ConstantConditions
 | 
			
		
	
		
			
				
					|  |  |  |  |                 mCallback.getJobWorker(name).remove(mDelayedJobs.get(name)); | 
			
		
	
		
			
				
					|  |  |  |  |                 mDelayedJobs.remove(name); | 
			
		
	
		
			
				
					|  |  |  |  |                 existing--; | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |             Token token = new Token(name, Tasks.forResult(null)); | 
			
		
	
		
			
				
					|  |  |  |  |             //noinspection StatementWithEmptyBody
 | 
			
		
	
		
			
				
					|  |  |  |  |             while (mJobs.remove(token)) { /* do nothing */ } | 
			
		
	
		
			
				
					|  |  |  |  |             ensureToken(); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
	
		
			
				
					|  |  |  | 
 |