/*
* Copyright (C) 2014 Freddie (Musenkishi) Lust-Hed
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.musenkishi.wally.observers;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import com.musenkishi.wally.dataprovider.FileManager;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
/**
* A BroadcastReceiver that can be used when you want to be notified when
* "com.musenkishi.wally.observers.GET_FILES" is broadcast.
*
* Created by Freddie (Musenkishi) Lust-Hed on 2014-05-29.
*/
public class FileReceiver extends BroadcastReceiver implements Handler.Callback {
public static final String GET_FILES = "com.musenkishi.wally.observers.GET_FILES";
public static final int MSG_GET_FILES = 57348;
public static final int MSG_SEND_FILES = 57349;
private ArrayList<OnFileChangeListener> onFileChangeListeners;
private final Handler uiHandler;
private final Handler backgroundHandler;
private Map<String, Boolean> existingFiles;
public interface OnFileChangeListener{
void onFileChange(Map<String, Boolean> existingFiles);
}
public FileReceiver() {
onFileChangeListeners = new ArrayList<>();
uiHandler = new Handler(Looper.getMainLooper(), this);
HandlerThread handlerThread = new HandlerThread("FileChangeReceiver.background");
handlerThread.start();
backgroundHandler = new Handler(handlerThread.getLooper(), this);
}
public void addListener(OnFileChangeListener onFileChangeListener){
if (onFileChangeListener != null) {
onFileChangeListeners.add(onFileChangeListener);
}
}
@Override
public void onReceive(Context context, Intent intent) {
if (GET_FILES.equals(intent.getAction()) &&
onFileChangeListeners != null &&
!backgroundHandler.hasMessages(MSG_GET_FILES)) {
backgroundHandler.sendEmptyMessage(MSG_GET_FILES);
}
}
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case MSG_GET_FILES:
Map<String, Boolean> savedFiles = new HashMap<>();
FileManager fileManager = new FileManager();
for (Uri uri : fileManager.getFiles()) {
String filename = uri.getLastPathSegment();
String[] filenames = filename.split("\\.(?=[^\\.]+$)"); //split filename from it's extension
savedFiles.put(filenames[0], true);
}
Message msgFiles = uiHandler.obtainMessage();
msgFiles.what = MSG_SEND_FILES;
msgFiles.obj = savedFiles;
uiHandler.sendMessage(msgFiles);
break;
case MSG_SEND_FILES:
existingFiles = (Map<String, Boolean>) msg.obj;
for (OnFileChangeListener listener : onFileChangeListeners){
if (listener != null) {
listener.onFileChange(existingFiles);
}
}
break;
}
return false;
}
public Map<String, Boolean> getExistingFiles() {
return existingFiles;
}
}