package com.summer.netcloud.utils;

import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.util.SparseArray;

import com.summer.netcloud.Constants;
import com.summer.netcloud.ContextMgr;
import com.summer.netcloud.R;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by summer on 14/06/2018.
 */

public class PackageUtils {
    private static final String TAG = Constants.TAG + ".PackageUtils";

    private static SparseArray<AppInfo> sUID2AppInfo = new SparseArray<>();

    public static List<AppInfo> getAllInstallApps(){
        PackageManager pm = ContextMgr.getApplicationContext().getPackageManager();
        List<ApplicationInfo> appsInfo = pm.getInstalledApplications(0);
        List<AppInfo> appInfos = new ArrayList<>();
        if(appsInfo != null){
            for(ApplicationInfo i:appsInfo){
                AppInfo appInfo = new AppInfo();
                appInfo.uid = i.uid;
                appInfo.icon = i.loadIcon(pm);
                appInfo.pkg = i.packageName;
                appInfo.name = i.loadLabel(pm).toString();
                appInfos.add(appInfo);
            }
        }
        return appInfos;
    }

    public static String getPackageName(int uid){
        PackageManager pm = ContextMgr.getApplicationContext().getPackageManager();
        String[] pkgs = pm.getPackagesForUid(uid);

        if(pkgs != null){
            for(String pkg:pkgs){
                Log.d(TAG,"pkg: " + pkg);
            }

            return pkgs[0];
        }

        return "system";
    }

    public static AppInfo getAppInfo(int uid){
        AppInfo ret = getInfo(uid);
        if(ret != null){
            return ret;
        }

        PackageManager pm = ContextMgr.getApplicationContext().getPackageManager();
        String pkg = getPackageName(uid);
        try{
            PackageInfo info = pm.getPackageInfo(pkg,0);
            if(info != null){
                AppInfo appInfo = new AppInfo();
                appInfo.uid = uid;
                appInfo.icon = info.applicationInfo.loadIcon(pm);
                appInfo.pkg = info.packageName;
                appInfo.name = info.applicationInfo.loadLabel(pm).toString();
                addInfo(appInfo);
                return appInfo;
            }
        }catch (Throwable t){
            ExceptionHandler.handleException(t);
        }

        return null;
    }

    public static int getDefaultAppIcon(int uid){
        return R.drawable.icon144;
    }

    public static String getDefaultAppName(int uid){
        return "system" + String.valueOf(uid);
    }

    private static AppInfo getInfo(int uid){
        synchronized (sUID2AppInfo){
            return sUID2AppInfo.get(uid);
        }
    }


    private static void addInfo(AppInfo info){
        synchronized (sUID2AppInfo){
            sUID2AppInfo.put(info.uid,info);
        }
    }


    public static class AppInfo{
        public int uid;
        public String pkg;
        public String name;
        public Drawable icon;
    }

}