Android Open Source - muckebox-android Cache Cleaner






From Project

Back to project page muckebox-android.

License

The source code is released under:

Apache License

If you think the Android project muckebox-android listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*   
 * Copyright 2013 Karsten Patzwaldt//from www.  java2  s.c o  m
 *
 * 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 org.muckebox.android.utils;

import java.util.HashSet;
import java.util.Set;

import org.muckebox.android.Muckebox;
import org.muckebox.android.db.MuckeboxProvider;
import org.muckebox.android.db.MuckeboxContract.CacheEntry;
import org.muckebox.android.db.MuckeboxContract.CachePlaylistEntry;
import org.muckebox.android.net.DownloadService;

import android.database.ContentObserver;
import android.database.Cursor;
import android.os.Handler;
import android.util.Log;

public class CacheCleaner extends ContentObserver {
    private final static String LOG_TAG = "CacheCleaner";
    
    public CacheCleaner(Handler handler) {
        super(handler);
    }

    @Override
    public void onChange(boolean selfChange) {
        Log.d(LOG_TAG, "Cache changed, checking");

        if (isCacheTooBig()) {
            Set<String> dbFiles = removeOldestEntryAndListFiles();
            Set<String> localFiles = getAllLocalFiles();

            localFiles.removeAll(dbFiles);

            for (String fileName: localFiles) {
                Log.w(LOG_TAG, "Found orphaned file " + fileName + ", removing");
                
                Muckebox.getAppContext().deleteFile(fileName);
            }
        }
    }
    
    private boolean isCacheTooBig() {
        return getCurrentCacheSize() > Preferences.getCacheSize();
    }
    
    private int getCurrentCacheSize() {
        Cursor c = Muckebox.getAppContext().getContentResolver().query(
            MuckeboxProvider.URI_CACHE_SIZE, null, null, null, null);
        
        try {
            if (c.moveToFirst()) {
                int ret = c.getInt(c.getColumnIndex(CacheEntry.ALIAS_SIZE));
                
                Log.d(LOG_TAG, "Current cache size is " + ret);
                
                return ret;
            } else {
                Log.e(LOG_TAG, "Could not get size");
                return 0;
            }
        } finally {
            c.close();
        }
    }
    
    private Set<String> removeOldestEntryAndListFiles() {
        Cursor c = Muckebox.getAppContext().getContentResolver().query(
            MuckeboxProvider.URI_CACHE, null, null, null, null);
        
        try {
            int playingIndex = c.getColumnIndex(CachePlaylistEntry.ALIAS_PLAYING);
            int pinnedIndex = c.getColumnIndex(CacheEntry.ALIAS_PINNED);
            int trackIdIndex = c.getColumnIndex(CacheEntry.ALIAS_TRACK_ID);
            int fileNameIndex = c.getColumnIndex(CacheEntry.ALIAS_FILENAME);
            boolean removedFile = false;
            Set<String> ret = new HashSet<String>();
            
            c.moveToPosition(-1);
            
            while (c.moveToNext()) {
                if (c.getInt(playingIndex) == 0 &&
                    c.getInt(pinnedIndex) == 0 &&
                    ! removedFile)
                {
                    int trackId = c.getInt(trackIdIndex);
                    
                    DownloadService.discardTrack(Muckebox.getAppContext(), trackId);
                    
                    Log.d(LOG_TAG, "Removing track " + trackId);
                    
                    removedFile = true;
                }
                
                ret.add(c.getString(fileNameIndex));
            }
            
            return ret;
        } finally {
            c.close();
        }
    }
    
    private Set<String> getAllLocalFiles() {
        Set<String> ret = new HashSet<String>();
        String[] fileList = Muckebox.getAppContext().fileList();
        
        for (int i = 0; i < fileList.length; ++i)
            ret.add(fileList[i]);
        
        return ret;
    }
}




Java Source Code List

org.muckebox.android.Muckebox.java
org.muckebox.android.audio.PlayerListener.java
org.muckebox.android.audio.PlayerService.java
org.muckebox.android.audio.PlayerWrapper.java
org.muckebox.android.db.DownloadEntryCursor.java
org.muckebox.android.db.MuckeboxContract.java
org.muckebox.android.db.MuckeboxDbHelper.java
org.muckebox.android.db.MuckeboxProvider.java
org.muckebox.android.db.PlaylistHelper.java
org.muckebox.android.net.ApiHelper.java
org.muckebox.android.net.DownloadCatchupRunnable.java
org.muckebox.android.net.DownloadListener.java
org.muckebox.android.net.DownloadRunnable.java
org.muckebox.android.net.DownloadServer.java
org.muckebox.android.net.DownloadService.java
org.muckebox.android.net.MuckeboxHttpClient.java
org.muckebox.android.net.PreannounceTask.java
org.muckebox.android.net.RefreshAlbumsTask.java
org.muckebox.android.net.RefreshArtistsAlbumsTask.java
org.muckebox.android.net.RefreshArtistsTask.java
org.muckebox.android.net.RefreshHelper.java
org.muckebox.android.net.RefreshTask.java
org.muckebox.android.net.RefreshTracksTask.java
org.muckebox.android.ui.activity.MuckeboxActivity.java
org.muckebox.android.ui.activity.WizardActivity.java
org.muckebox.android.ui.fragment.AlbumListFragment.java
org.muckebox.android.ui.fragment.ArtistListFragment.java
org.muckebox.android.ui.fragment.DownloadListFragment.java
org.muckebox.android.ui.fragment.DrawerFragment.java
org.muckebox.android.ui.fragment.PlayerFragment.java
org.muckebox.android.ui.fragment.SettingsFragment.java
org.muckebox.android.ui.fragment.TrackListFragment.java
org.muckebox.android.ui.utils.ExpandableCursorAdapter.java
org.muckebox.android.ui.utils.HeightEvaluator.java
org.muckebox.android.ui.utils.ImageButtonHelper.java
org.muckebox.android.ui.utils.NavigationListener.java
org.muckebox.android.ui.utils.ScrollYAnimator.java
org.muckebox.android.ui.utils.TimeFormatter.java
org.muckebox.android.ui.widgets.ImageViewRotater.java
org.muckebox.android.ui.widgets.LiveSearchView.java
org.muckebox.android.ui.widgets.RefreshableListFragment.java
org.muckebox.android.ui.widgets.SearchableListFragment.java
org.muckebox.android.utils.BufferUtils.java
org.muckebox.android.utils.CacheCleaner.java
org.muckebox.android.utils.Preferences.java
org.muckebox.android.utils.RemoteControlReceiver.java