Android Open Source - netmbuddy Utils






From Project

Back to project page netmbuddy.

License

The source code is released under:

------- Default ------- Copyright (C) 2012, 2013, 2014 Younghyung Cho. <yhcting77@gmail.com> All rights reserved. This file is part of NetMBuddy This program is licensed under the FreeBSD license R...

If you think the Android project netmbuddy 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 (C) 2012, 2013, 2014//  w w w .  jav a 2 s  . c o  m
 * Younghyung Cho. <yhcting77@gmail.com>
 * All rights reserved.
 *
 * This file is part of NetMBuddy
 *
 * This program is licensed under the FreeBSD license
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * The views and conclusions contained in the software and documentation
 * are those of the authors and should not be interpreted as representing
 * official policies, either expressed or implied, of the FreeBSD Project.
 *****************************************************************************/

package free.yhc.netmbuddy.utils;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;

import org.apache.http.impl.cookie.DateParseException;
import org.apache.http.impl.cookie.DateUtils;

import android.app.Activity;
import android.app.ActivityManager;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.graphics.Rect;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.Window;
import free.yhc.netmbuddy.R;
import free.yhc.netmbuddy.YTMPActivity;
import free.yhc.netmbuddy.model.Policy;
import free.yhc.netmbuddy.model.RTState;

public class Utils {
    private static final boolean DBG = false;
    private static final Utils.Logger P = new Logger(Utils.class);

    //private static final boolean DBG    = false;
    private static final boolean LOGF   = false;
    private static final String  TAG    = "[YoutubeMusicPlayer]";

    // Value SHOULD match xml preference value for title tts.
    private static final int    TITLE_TTS_HEAD  = 0x02; // tts at the beginning
    private static final int    TITLE_TTS_TAIL  = 0x01; // tts at the end

    // This is only for debugging.
    private static boolean  sInitialized = false;

    // For debugging
    private static PrintWriter  sLogWriter  = null;
    private static DateFormat   sLogTimeDateFormat =
            DateFormat.getDateTimeInstance(DateFormat.MEDIUM,
                                           DateFormat.MEDIUM,
                                           Locale.ENGLISH);

    // Even if these two variables are not 'final', those should be handled like 'final'
    //   because those are set only at init() function, and SHOULD NOT be changed.
    private static Context  sAppContext  = null;
    private static Handler  sUiHandler   = null;

    private static SharedPreferences sPrefs = null;
    private static TimeElemComparator   sTimeElemComparator = new TimeElemComparator();

    private static final String[] sDateFormats = new String[] {
            // To support W3CDTF
        "yyyy-MM-d'T'HH:mm:ss.SSSZ",
        "yyyy-MM-d'T'HH:mm:ss.SSS'Z'",
        "yyyy-MM-d'T'HH:mm:ssZ",
        "yyyy-MM-d'T'HH:mm:ss'Z'",
    };

    public static enum PrefLevel {
        LOW,
        NORMAL,
        HIGH
    }

    public static enum PrefQuality {
        LOW     (R.string.low),
        MIDLOW  (R.string.midlow),
        NORMAL  (R.string.normal),
        HIGH    (R.string.high),
        VERYHIGH(R.string.veryhigh);

        private int text;
        private
        PrefQuality(int aText) {
            text = aText;
        }

        public int
        getText() {
            return text;
        }

        public static PrefQuality
        getMatchingQuality(int text) {
            for (PrefQuality q : PrefQuality.values()) {
                if (q.getText() == text)
                    return q;
            }
            return null;
        }
    }

    public static enum PrefTitleSimilarityThreshold {
        VERYLOW (Policy.SIMILARITY_THRESHOLD_VERYLOW),
        LOW     (Policy.SIMILARITY_THRESHOLD_LOW),
        NORMAL  (Policy.SIMILARITY_THRESHOLD_NORMAL),
        HIGH    (Policy.SIMILARITY_THRESHOLD_HIGH),
        VERYHIGH(Policy.SIMILARITY_THRESHOLD_VERYHIGH);

        private float v;
        private
        PrefTitleSimilarityThreshold(float aV) {
            v = aV;
        }

        public float
        getValue() {
            return v;
        }
    }

    private static class TimeElem {
        public Object   v;
        public long     time;

        public
        TimeElem(Object aV, long aTime) {
            v = aV;
            time = aTime;
        }
    }

    private static class TimeElemComparator implements Comparator<TimeElem> {
        @Override
        public int
        compare(TimeElem a0, TimeElem a1) {
            if (a0.time < a1.time)
                return -1;
            else if (a0.time > a1.time)
                return 1;
            else
                return 0;
        }
    }

    // ========================================================================
    //
    // Initialization
    //
    // ========================================================================

    public static void
    init(Context aAppContext) {
        // This is called first for module initialization.
        // So, ANY DEPENDENCY to other module is NOT allowed
        eAssert(!sInitialized);
        if (!sInitialized)
            sInitialized = true;

        new File(Policy.APPDATA_DIR).mkdirs();
        new File(Policy.APPDATA_VIDDIR).mkdirs();
        new File(Policy.APPDATA_LOGDIR).mkdirs();

        // Clear/Create cache directory!
        File cacheF = new File(Policy.APPDATA_CACHEDIR);
        FileUtils.removeFileRecursive(cacheF, cacheF);
        cacheF.mkdirs();

        // Clear/Make temp directory!
        File tempF = new File(Policy.APPDATA_TMPDIR);
        FileUtils.removeFileRecursive(tempF, tempF);
        tempF.mkdirs();

        if (LOGF) {
            new File(Policy.APPDATA_LOGDIR).mkdirs();
            String dateText = DateFormat
                                .getDateTimeInstance(DateFormat.MEDIUM,
                                                     DateFormat.MEDIUM,
                                                     Locale.ENGLISH)
                                .format(new Date(System.currentTimeMillis()));
            dateText = dateText.replace(' ', '_');
            File logF = new File(Policy.APPDATA_LOGDIR + dateText + ".log");
            try {
                sLogWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(logF)));
            } catch (FileNotFoundException e) {
                eAssert(false);
            }
        }

        sAppContext = aAppContext;
        sUiHandler = new Handler();
        sPrefs = PreferenceManager.getDefaultSharedPreferences(getAppContext());

    }

    // ========================================================================
    //
    // Fundamentals
    //
    // ========================================================================
    private static enum LogLV{
        V ("[V]", 6),
        D ("[D]", 5),
        I ("[I]", 4),
        W ("[W]", 3),
        E ("[E]", 2),
        F ("[F]", 1);

        private String pref; // prefix string
        private int    pri;  // priority
        LogLV(String aPref, int aPri) {
            pref = aPref;
            pri = aPri;
        }

        String pref() {
            return pref;
        }

        int pri() {
            return pri;
        }
    }

    public static class Logger {
        private final Class<?> _mCls;
        public Logger(Class<?> cls) {
            _mCls = cls;
        }
        // For logging
        public void v(String msg) { log(_mCls, LogLV.V, msg); }
        public void d(String msg) { log(_mCls, LogLV.D, msg); }
        public void i(String msg) { log(_mCls, LogLV.I, msg); }
        public void w(String msg) { log(_mCls, LogLV.W, msg); }
        public void e(String msg) { log(_mCls, LogLV.E, msg); }
        public void f(String msg) { log(_mCls, LogLV.F, msg); }
    }

    private static void
    log(Class<?> cls, LogLV lv, String msg) {
        if (null == msg)
            return;

        StackTraceElement ste = Thread.currentThread().getStackTrace()[5];
        msg = ste.getClassName() + "/" + ste.getMethodName() + "(" + ste.getLineNumber() + ") : " + msg;

        if (!LOGF) {
            switch(lv) {
            case V: Log.v(cls.getSimpleName(), msg); break;
            case D: Log.d(cls.getSimpleName(), msg); break;
            case I: Log.i(cls.getSimpleName(), msg); break;
            case W: Log.w(cls.getSimpleName(), msg); break;
            case E: Log.e(cls.getSimpleName(), msg); break;
            case F: Log.wtf(cls.getSimpleName(), msg); break;
            }
        } else {
            long timems = System.currentTimeMillis();
            sLogWriter.printf("<%s:%03d> [%s] %s\n",
                              sLogTimeDateFormat.format(new Date(timems)),
                              timems % 1000,
                              lv.name(),
                              msg);
            sLogWriter.flush();
        }
    }

    // Assert
    public static void
    eAssert(boolean cond) {
        if (!cond)
            throw new AssertionError();
    }

    public static Context
    getAppContext() {
        return sAppContext;
    }

    public static Resources
    getResources() {
        return getAppContext().getResources();
    }

    public static String
    getResString(int id) {
        return getResources().getString(id);
    }

    public static Handler
    getUiHandler() {
        return sUiHandler;
    }

    public static boolean
    isUiThread(Thread thread) {
        return thread == sUiHandler.getLooper().getThread();
    }

    public static boolean
    isUiThread() {
        return isUiThread(Thread.currentThread());
    }
    // ========================================================================
    //
    //
    //
    // ========================================================================

    /**
     * Is is valid string?
     * Valid means "Not NULL and Not empty".
     * @param v
     * @return
     */
    public static boolean
    isValidValue(CharSequence v) {
        return !(null == v || v.length() <= 0);
    }

    /**
     * Is any available active network at this device?
     * @return
     */
    public static boolean
    isNetworkAvailable() {

        ConnectivityManager cm = (ConnectivityManager)getAppContext().getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo ni;

        if (isPrefUseWifiOnly())
            ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        else
            ni = cm.getActiveNetworkInfo();

        if (null != ni)
            return ni.isConnectedOrConnecting();
        else
            return false;
    }

    public static String
    getCurrentTopActivity() {
        ActivityManager am = (ActivityManager)getAppContext().getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
        ActivityManager.RunningTaskInfo ar = tasks.get(0);
        return ar.topActivity.getClassName().toString();
    }

    public static boolean
    isAppForeground() {
        return getCurrentTopActivity().startsWith(getAppContext().getPackageName()+".");
    }

    public static void
    resumeApp() {
        Intent intent = new Intent(Utils.getAppContext(), YTMPActivity.class);
        intent.setAction(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        Utils.getAppContext().startActivity(intent);
    }
    // ------------------------------------------------------------------------
    //
    //
    //
    // ------------------------------------------------------------------------
    public static long[]
    convertArrayLongTolong(Long[] L) {
        long[] l = new long[L.length];
        for (int i = 0; i < L.length; i++)
            l[i] = L[i];
        return l;
    }

    public static int[]
    convertArrayIntegerToint(Integer[] I) {
        int[] i = new int[I.length];
        for (int j = 0; j < I.length; j++)
            i[j] = I[j];
        return i;
    }

    // ------------------------------------------------------------------------
    //
    // Date
    //
    // ------------------------------------------------------------------------
    public static String
    removeLeadingTrailingWhiteSpace(String s) {
        s = s.replaceFirst("^\\s+", "");
        return s.replaceFirst("\\s+$", "");
    }

    public static Date
    parseDateString(String dateString) {
        dateString = removeLeadingTrailingWhiteSpace(dateString);
        Date date = null;
        try {
            date = DateUtils.parseDate(dateString, sDateFormats);
        } catch (DateParseException e) { }
        return date;
    }

    // ------------------------------------------------------
    // To handle generic array
    // ------------------------------------------------------
    public static <T> T[]
    toArray(List<T> list, T[] a) {
        if (a.length < list.size())
            a = (T[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), list.size());
        return list.toArray(a);
    }

    public static <T> T[]
    toArray(List<T> list, Class<T> k) {
        return list.toArray((T[])java.lang.reflect.Array.newInstance(k, list.size()));
    }

    public static <T> T[]
    newArray(Class<T> k, int size) {
        return (T[])java.lang.reflect.Array.newInstance(k, size);
    }

    // ------------------------------------------------------------------------
    //
    // Accessing preference
    //
    // ------------------------------------------------------------------------
    private static String
    getStringPreference(String key, String defvalue) {
        String value = (String)RTState.get().getOverridingPreference(key);
        if (null == value)
            value = sPrefs.getString(key, defvalue);
        return value;
    }

    private static int
    getIntPreference(String key, int defvalue) {
        Integer value = (Integer)RTState.get().getOverridingPreference(key);
        if (null == value)
            value = sPrefs.getInt(key, defvalue);
        return value;
    }

    private static boolean
    getBooleanPreference(String key, boolean defvalue) {
        Boolean value = (Boolean)RTState.get().getOverridingPreference(key);
        if (null == value)
            value = sPrefs.getBoolean(key, defvalue);
        return value;
    }

    public static SharedPreferences
    getSharedPreference() {
        return sPrefs;
    }

    public static boolean
    isPrefSuffle() {
        return getBooleanPreference(getResString(R.string.csshuffle), false);
    }

    public static boolean
    isPrefRepeat() {
        return getBooleanPreference(getResString(R.string.csrepeat), false);
    }

    public static PrefQuality
    getPrefQuality() {
        String v = getStringPreference(getResString(R.string.csquality),
                                       getResString(R.string.csNORMAL));
        for (PrefQuality q : PrefQuality.values()) {
            if (q.name().equals(v))
                return q;
        }
        eAssert(false);
        return null;
    }

    public static float
    getPrefTitleSimilarityThreshold() {
        String v = getStringPreference(getResString(R.string.cstitle_similarity_threshold),
                                       getResString(R.string.csNORMAL));
        for (PrefTitleSimilarityThreshold q : PrefTitleSimilarityThreshold.values()) {
            if (q.name().equals(v))
                return q.getValue();
        }
        eAssert(false);
        return Policy.SIMILARITY_THRESHOLD_NORMAL;
    }

    public static PrefLevel
    getPrefMemConsumption() {
        // See preference.xml for meaning of each number value.
        String lv = sPrefs.getString(getResString(R.string.csmem_consumption),
                getResString(R.string.csNORMAL));
        if (getResString(R.string.csLOW).equals(lv))
            return PrefLevel.LOW;
        else if (getResString(R.string.csNORMAL).equals(lv))
            return PrefLevel.NORMAL;
        else if (getResString(R.string.csHIGH).equals(lv))
            return PrefLevel.HIGH;
        else {
            eAssert(false);
            return PrefLevel.NORMAL;
        }
    }

    public static boolean
    isPrefLockScreen() {
        return getBooleanPreference(getResString(R.string.cslockscreen), false);
    }

    public static boolean
    isPrefStopOnBack() {
        return getBooleanPreference(getResString(R.string.csstop_on_back), true);
    }

    public static boolean
    isPrefErrReport() {
        return getBooleanPreference(getResString(R.string.cserr_report), true);
    }

    private static boolean
    isPrefUseWifiOnly() {
        return getBooleanPreference(getResString(R.string.csuse_wifi_only), true);
    }

    public static int
    getPrefTtsValue() {
        int value = 0;
        try {
            value = Integer.parseInt(sPrefs.getString(getResString(R.string.cstitle_tts), "0"));
        } catch (NumberFormatException ignored) { }
        return value;
    }

    public static boolean
    isPrefTtsEnabled() {
        return 0 != getPrefTtsValue();
    }

    public static boolean
    isPrefHeadTts() {
        return (0 != (TITLE_TTS_HEAD & getPrefTtsValue()));
    }

    public static boolean
    isPrefTailTts() {
        return (0 != (TITLE_TTS_TAIL & getPrefTtsValue()));
    }
    // ------------------------------------------------------------------------
    //
    // Min Max
    //
    // ------------------------------------------------------------------------
    public static float
    max(float f0, float f1) {
        return (f0 < f1)? f1: f0;
    }

    // ------------------------------------------------------------------------
    //
    // Bit mask handling
    //
    // ------------------------------------------------------------------------
    public static long
    bitClear(long flag, long mask) {
        return flag & ~mask;
    }

    public static long
    bitSet(long flag, long value, long mask) {
        flag = bitClear(flag, mask);
        return flag | (value & mask);
    }

    public static boolean
    bitCompare(long flag, long value, long mask) {
        return value == (flag & mask);
    }

    public static boolean
    bitIsSet(long flag, long mask) {
        return bitCompare(flag, mask, mask);
    }

    public static boolean
    bitIsClear(long flag, long mask) {
        return bitCompare(flag, 0, mask);
    }

    public static int
    bitClear(int flag, int mask) {
        return flag & ~mask;
    }

    public static int
    bitSet(int flag, int value, int mask) {
        flag = bitClear(flag, mask);
        return flag | (value & mask);
    }

    public static boolean
    bitCompare(int flag, int value, int mask) {
        return value == (flag & mask);
    }

    public static boolean
    bitIsSet(int flag, int mask) {
        return bitCompare(flag, mask, mask);
    }

    public static boolean
    bitIsClear(int flag, int mask) {
        return bitCompare(flag, 0, mask);
    }

    // ------------------------------------------------------------------------
    //
    // Misc
    //
    // ------------------------------------------------------------------------
    public static String
    secsToTimeText(int secs) {
        int h = secs / 60 / 60;
        secs -= h * 60 * 60;
        int m = secs / 60;
        secs -= m * 60;
        return String.format("%02d:%02d:%02d", h, m, secs);
    }

    public static String
    secsToMinSecText(int secs) {
        int m = secs / 60;
        secs -= m * 60;
        return String.format("%02d:%02d", m, secs);
    }

    public static String
    millisToHourMinText(long millies) {
        int s = (int)(millies / 1000);
        int m = s / 60;
        int h = m / 60;
        m -= h * 60;
        return String.format("%02d:%02d", h, m);
    }

    public static void
    copy(OutputStream os, InputStream is) throws IOException, InterruptedException {
        byte buf[]=new byte[1024 * 16];
        int len;
        while((len = is.read(buf)) > 0) {
            if (Thread.currentThread().isInterrupted())
                throw new InterruptedException();
            os.write(buf, 0, len);
        }
    }

    public static <K,V> K
    findKey(HashMap<K, V> map, V value) {
        Iterator<K> iter = map.keySet().iterator();
        while(iter.hasNext()) {
            K key = iter.next();
            if (map.get(key).equals(value))
                return key;
        }
        return null;
    }

    public static Object[]
    getSortedKeyOfTimeMap (HashMap<? extends Object, Long> timeMap) {
        TimeElem[] te = new TimeElem[timeMap.size()];
        Object[] vs = timeMap.keySet().toArray(new Object[0]);
        for (int i = 0; i < vs.length; i++)
            te[i] = new TimeElem(vs[i], timeMap.get(vs[i]));
        Arrays.sort(te, sTimeElemComparator);
        Object[] sorted = new Object[vs.length];
        for (int i = 0; i < sorted.length; i++)
            sorted[i] = te[i].v;

        return sorted;
    }

    // ------------------------------------------------------------------------
    //
    // Other android specifics.
    //
    // ------------------------------------------------------------------------
    public static boolean
    copyAssetFile(String dest, String assetFile) {
        try {
            InputStream is = Utils.getAppContext().getAssets().open(assetFile);
            FileOutputStream os = new FileOutputStream(new File(dest));
            copy(os, is);
            is.close();
            os.close();
            return true;
        } catch (InterruptedException e) {
            return false;
        } catch (IOException e) {
            return false;
        }
    }

    public static void
    sendMail(Context    context,
             String     receiver,
             String     subject,
             String     text,
             File       attachment) {
        if (!Utils.isNetworkAvailable())
            return;

        Intent intent = new Intent(Intent.ACTION_SEND);
        if (null != receiver)
            intent.putExtra(Intent.EXTRA_EMAIL, new String[] { receiver });
        intent.putExtra(Intent.EXTRA_TEXT, text);
        intent.putExtra(Intent.EXTRA_SUBJECT, subject);
        if (null != attachment)
            intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(attachment));
        intent.setType("message/rfc822");
        try {
            context.startActivity(intent);
        } catch (ActivityNotFoundException e) {
            UiUtils.showTextToast(context, R.string.msg_fail_find_app);
        }
    }

    /**
     * Only available when status bar is showing.
     * @param activity
     * @return
     */
    public static int
    getStatusBarHeight(Activity activity) {
        Rect rect= new Rect();
        Window window= activity.getWindow();
        window.getDecorView().getWindowVisibleDisplayFrame(rect);
        // Below is for future reference.
        // int StatusBarHeight = rect.top;
        // int contentViewTop = window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
        // int TitleBarHeight= contentViewTop - StatusBarHeight;
        return rect.top;
    }

    public static Rect
    getVisibleFrame(Activity activity) {
        Rect rect= new Rect();
        Window window= activity.getWindow();
        window.getDecorView().getWindowVisibleDisplayFrame(rect);
        return rect;
    }
}




Java Source Code List

free.yhc.netmbuddy.DiagAsyncTask.java
free.yhc.netmbuddy.Err.java
free.yhc.netmbuddy.FragmentPagerAdapterEx.java
free.yhc.netmbuddy.ImportShareActivity.java
free.yhc.netmbuddy.ImportShareContentActivity.java
free.yhc.netmbuddy.ImportShareFileActivity.java
free.yhc.netmbuddy.LockScreenActivity.java
free.yhc.netmbuddy.MusicsActivity.java
free.yhc.netmbuddy.MusicsAdapter.java
free.yhc.netmbuddy.PlaylistActivity.java
free.yhc.netmbuddy.PlaylistAdapter.java
free.yhc.netmbuddy.VideoPlayerActivity.java
free.yhc.netmbuddy.YTMPActivity.java
free.yhc.netmbuddy.YTMPApp.java
free.yhc.netmbuddy.YTMPPreferenceActivity.java
free.yhc.netmbuddy.YTPlaylistSearchActivity.java
free.yhc.netmbuddy.YTPlaylistSearchAdapter.java
free.yhc.netmbuddy.YTPlaylistSearchFragment.java
free.yhc.netmbuddy.YTSearchActivity.java
free.yhc.netmbuddy.YTSearchAdapter.java
free.yhc.netmbuddy.YTSearchFragment.java
free.yhc.netmbuddy.YTSearchPagerAdapter.java
free.yhc.netmbuddy.YTVideoSearchActivity.java
free.yhc.netmbuddy.YTVideoSearchAdapter.java
free.yhc.netmbuddy.YTVideoSearchAuthorActivity.java
free.yhc.netmbuddy.YTVideoSearchFragment.java
free.yhc.netmbuddy.YTVideoSearchKeywordActivity.java
free.yhc.netmbuddy.YTVideoSearchPlaylistActivity.java
free.yhc.netmbuddy.db.ColPlaylist.java
free.yhc.netmbuddy.db.ColVideoRef.java
free.yhc.netmbuddy.db.ColVideo.java
free.yhc.netmbuddy.db.DBHelper.java
free.yhc.netmbuddy.db.DBHistory.java
free.yhc.netmbuddy.db.DBManager.java
free.yhc.netmbuddy.db.DBUpgrader.java
free.yhc.netmbuddy.db.DBUtils.java
free.yhc.netmbuddy.db.DB.java
free.yhc.netmbuddy.model.AtomicFloat.java
free.yhc.netmbuddy.model.BGTask.java
free.yhc.netmbuddy.model.HttpUtils.java
free.yhc.netmbuddy.model.KBLinkedList.java
free.yhc.netmbuddy.model.MultiThreadRunner.java
free.yhc.netmbuddy.model.NetLoader.java
free.yhc.netmbuddy.model.NotiManager.java
free.yhc.netmbuddy.model.Policy.java
free.yhc.netmbuddy.model.RTState.java
free.yhc.netmbuddy.model.SearchSuggestionProvider.java
free.yhc.netmbuddy.model.UnexpectedExceptionHandler.java
free.yhc.netmbuddy.model.YTConstants.java
free.yhc.netmbuddy.model.YTDownloader.java
free.yhc.netmbuddy.model.YTFeed.java
free.yhc.netmbuddy.model.YTHacker.java
free.yhc.netmbuddy.model.YTPlayerLifeSupportService.java
free.yhc.netmbuddy.model.YTPlayerUI.java
free.yhc.netmbuddy.model.YTPlayerVideoListAdapter.java
free.yhc.netmbuddy.model.YTPlayerVideoListManager.java
free.yhc.netmbuddy.model.YTPlayer.java
free.yhc.netmbuddy.model.YTPlaylistFeed.java
free.yhc.netmbuddy.model.YTSearchHelper.java
free.yhc.netmbuddy.model.YTVideoFeed.java
free.yhc.netmbuddy.scmp.DNLoop.java
free.yhc.netmbuddy.scmp.SCElemChar.java
free.yhc.netmbuddy.scmp.SCElemI.java
free.yhc.netmbuddy.scmp.SCElemSStr.java
free.yhc.netmbuddy.scmp.SCElemSTok.java
free.yhc.netmbuddy.scmp.SCElemTok.java
free.yhc.netmbuddy.scmp.SCElem.java
free.yhc.netmbuddy.scmp.SCmpPolicy.java
free.yhc.netmbuddy.scmp.SCmp.java
free.yhc.netmbuddy.share.ExporterPlaylist.java
free.yhc.netmbuddy.share.ImporterPlaylist.java
free.yhc.netmbuddy.share.Importer.java
free.yhc.netmbuddy.share.Json.java
free.yhc.netmbuddy.share.Share.java
free.yhc.netmbuddy.utils.BookmarkListAdapter.java
free.yhc.netmbuddy.utils.FileUtils.java
free.yhc.netmbuddy.utils.ImageUtils.java
free.yhc.netmbuddy.utils.ReportUtils.java
free.yhc.netmbuddy.utils.SimilarTitlesListAdapter.java
free.yhc.netmbuddy.utils.UiUtils.java
free.yhc.netmbuddy.utils.Utils.java
free.yhc.netmbuddy.utils.YTUtils.java