Migrate to gradle, appcompat as external dependency.
[mobilnebezpieczenstwo.git] / app / src / main / java / com / samsung / srpol / loader / AppDetails.java
diff --git a/app/src/main/java/com/samsung/srpol/loader/AppDetails.java b/app/src/main/java/com/samsung/srpol/loader/AppDetails.java
new file mode 100644 (file)
index 0000000..6fff62b
--- /dev/null
@@ -0,0 +1,198 @@
+/*
+   Copyright (C) 2014  Samsung Electronics Polska Sp. z o.o.
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU AFFERO General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+    You may obtain a copy of the License at
+
+                http://www.gnu.org/licenses/agpl-3.0.txt
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+package com.samsung.srpol.loader;
+
+import java.io.File;
+import java.util.Comparator;
+
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.graphics.ColorMatrix;
+import android.graphics.ColorMatrixColorFilter;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+
+/**
+ * Helper class containing details about given permission
+ * 
+ * This Class contains : String mPermissionName; String
+ *         mPermissionLabel; String mPermissionDetails;
+ */
+public class AppDetails {
+    public static final String TAG = "AppDetails";
+    private static final ColorMatrixColorFilter mGrayscaleFilter;
+
+    private String mAppName;
+    private String mPackageName;
+    private Drawable mAppIcon;
+    private boolean mSystemApp;
+
+    private int mSubCategoriesMask;
+
+    private static AppListLoader mLoader;
+    private boolean mEnabled;
+    private boolean mMounted;
+    private final File mApkFile;
+
+    static {
+        ColorMatrix matrix = new ColorMatrix();
+        matrix.setSaturation(0);
+        mGrayscaleFilter = new ColorMatrixColorFilter(matrix);
+    }
+
+    public AppDetails(AppListLoader loader, PackageInfo packageinfo) {
+        mLoader = loader;
+        mPackageName = packageinfo.applicationInfo.packageName;
+        mEnabled = packageinfo.applicationInfo.enabled;
+        mApkFile = new File(packageinfo.applicationInfo.sourceDir);
+        if (!mApkFile.exists()) {
+            mMounted = false;
+            mAppName = packageinfo.applicationInfo.packageName;
+        } else {
+            mMounted = true;
+            CharSequence label = packageinfo.applicationInfo.loadLabel(mLoader.getPm());
+            mAppName = label != null ? label.toString()
+                    : packageinfo.applicationInfo.packageName;
+        }
+        mSystemApp = (packageinfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0;
+    }
+
+    /**
+     * @return the mAppName
+     */
+    public String getAppName() {
+        return mAppName;
+    }
+
+    /**
+     * @return the mAppPackageName
+     */
+    public String getAppPackageName() {
+        return mPackageName;
+    }
+
+    /**
+     * @return the mAppIcon
+     */
+    public Drawable getAppIcon() {
+        if (mAppIcon == null || !mMounted) {
+            if (mApkFile.exists()) {
+                try {
+                    mAppIcon = mLoader.getPm().getApplicationIcon(mPackageName);
+                } catch (NameNotFoundException e) {
+                    mAppIcon = mLoader.getContext().getResources()
+                            .getDrawable(android.R.drawable.sym_def_app_icon);
+                }
+                mMounted = true;
+                return updateAppIconColor(mAppIcon);
+            } else {
+                mMounted = false;
+                return updateAppIconColor(mLoader.getContext().getResources()
+                        .getDrawable(android.R.drawable.sym_def_app_icon));
+            }
+        } else
+            return mAppIcon;
+    }
+
+    public int getSubcategoriesMask() {
+        return mSubCategoriesMask;
+    }
+
+    public boolean isInSubcategory(int subcategoryId) {
+        return (mSubCategoriesMask & subcategoryId) > 0;
+    }
+    
+    public boolean isInAllSubcategories(int subcategoryIds) {
+        return (mSubCategoriesMask & subcategoryIds) == subcategoryIds;
+    }
+
+    public boolean isEnabled() {
+        return mEnabled;
+    }
+
+    public void setEnabled(boolean state) {
+        mEnabled = state;
+        updateAppIconColor(mAppIcon);
+    }
+
+    private Drawable updateAppIconColor(Drawable icon) {
+        // disabling and enabling apps in system application manager is
+        // available since API 4.0
+        if (icon != null
+                && Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
+            if (mEnabled) {
+                icon.setColorFilter(null);
+            } else {
+                icon.setColorFilter(mGrayscaleFilter);
+            }
+        }
+        return icon;
+    }
+
+    /**
+     * @return the mSystemApp
+     */
+    public boolean isSystemApp() {
+        return mSystemApp;
+    }
+
+    public void addSubcategory(int id) {
+        mSubCategoriesMask |= id;
+    }
+
+    /**
+     * @return the mAppPackageName
+     */
+    @Override
+    public String toString() {
+        return mPackageName;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o instanceof AppDetails) {
+            AppDetails appDetails = (AppDetails) o;
+            if (appDetails.getAppPackageName().equals(mPackageName)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Perform inteligent comparison of application entry objects.
+     */
+    public static final Comparator<AppDetails> SMART_COMPARATOR = new Comparator<AppDetails>() {
+        @Override
+        public int compare(AppDetails object1, AppDetails object2) {
+            if (object1.mSystemApp) {
+                if (object2.mSystemApp)
+                    return object1.mAppName.compareTo(object2.mAppName);
+                return 1;
+            } else {
+                if (object2.mSystemApp)
+                    return -1;
+                return object1.mAppName.compareTo(object2.mAppName);
+            }
+        }
+    };
+}