/**
* Copyright (c) 2013-2014, Rinc Liu (http://rincliu.com).
*
* 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.rincliu.library.util;
import java.io.DataOutputStream;
import java.io.File;
import java.io.OutputStream;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ServiceInfo;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.media.MediaScannerConnection;
import android.media.MediaScannerConnection.OnScanCompletedListener;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.Window;
import android.view.WindowManager;
import com.rincliu.library.util.RLAPICompat;
import com.rincliu.library.entity.RLDisplayInfo;
public class RLSysUtil {
/**
* @param activity
*/
@SuppressLint("InlinedApi")
public static void enableHardwareAccelerate(Activity activity) {
if (VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB) {
activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
}
}
/**
* @param context
* @param files
* @param mimeTypes
*/
public static void scanMediaFiles(final Context context, String[] files, String[] mimeTypes) {
MediaScannerConnection.scanFile(context, files, mimeTypes, new OnScanCompletedListener() {
@Override
public void onScanCompleted(String arg0, Uri arg1) {
// TODO
}
});
}
/**
* @param context
* @param key
* @return
*/
public static String getApplicationMetaData(Context context, String key) {
String data = null;
ApplicationInfo info = null;
try {
info = context.getPackageManager().getApplicationInfo(context.getPackageName(),
PackageManager.GET_META_DATA);
} catch (NameNotFoundException e) {
e.printStackTrace();
}
if (info != null && info.metaData != null && info.metaData.get(key) != null) {
data = info.metaData.get(key).toString();
}
return data;
}
/**
* @param activity
* @param key
* @return
*/
public static String getActivityMetaData(Activity activity, String key) {
String data = null;
ActivityInfo info = null;
try {
info = activity.getPackageManager().getActivityInfo(activity.getComponentName(),
PackageManager.GET_META_DATA);
} catch (NameNotFoundException e) {
e.printStackTrace();
}
if (info != null && info.metaData != null && info.metaData.get(key) != null) {
data = info.metaData.get(key).toString();
}
return data;
}
/**
* @param context
* @param serviceClass
* @param key
* @return
*/
public static String getServiceMetaData(Context context, Class<?> serviceClass, String key) {
String data = null;
ServiceInfo info = null;
try {
info = context.getPackageManager().getServiceInfo(new ComponentName(context, serviceClass),
PackageManager.GET_META_DATA);
} catch (NameNotFoundException e) {
e.printStackTrace();
}
if (info != null && info.metaData != null && info.metaData.get(key) != null) {
data = info.metaData.get(key).toString();
}
return data;
}
/**
* @param context
* @param receiverClass
* @param key
* @return
*/
public static String getReceiverMetaData(Context context, Class<?> receiverClass, String key) {
String data = null;
ActivityInfo info = null;
try {
info = context.getPackageManager().getReceiverInfo(new ComponentName(context, receiverClass),
PackageManager.GET_META_DATA);
} catch (NameNotFoundException e) {
e.printStackTrace();
}
if (info != null && info.metaData != null && info.metaData.get(key) != null) {
data = info.metaData.get(key).toString();
}
return data;
}
/**
* @param activity
* @return
*/
public static RLDisplayInfo getDisplayInfo(final Activity activity) {
final Resources res = activity.getResources();
final RLDisplayInfo di = new RLDisplayInfo();
Display display = activity.getWindowManager().getDefaultDisplay();
DisplayMetrics dm = res.getDisplayMetrics();
display.getMetrics(dm);
di.setDisplayWidth(dm.widthPixels);
di.setDisplayHeight(dm.heightPixels);
di.setDisplayDensity(dm.density);
int statusResId = res.getIdentifier("status_bar_height", "dimen", "android");
if (statusResId > 0) {
di.setStatusBarHeight(res.getDimensionPixelSize(statusResId));
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
int portraitResId = res.getIdentifier("navigation_bar_height", "dimen", "android");
if (portraitResId > 0) {
di.setPortraitNavigationBarHeight(res.getDimensionPixelSize(portraitResId));
}
} else {
new Thread() {
public void run() {
try {
Thread.sleep(200);
} catch (Exception e) {
e.printStackTrace();
}
Window window = activity.getWindow();
int contentViewTop = window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
int titleBarHeight = contentViewTop - di.getStatusBarHeight();
Configuration config = res.getConfiguration();
if (config.orientation == Configuration.ORIENTATION_PORTRAIT) {
di.setPortraitNavigationBarHeight(titleBarHeight);
} else if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) {
di.setLandscapeNavigationBarHeight(titleBarHeight);
}
}
}.start();
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
int landscapeResId = res.getIdentifier("navigation_bar_height_landscape", "dimen", "android");
if (landscapeResId > 0) {
di.setLandscapeNavigationBarHeight(res.getDimensionPixelSize(landscapeResId));
}
} else {
// TODO
}
return di;
}
/**
* @param context
* @param dp
* @return
*/
public static int dip2px(Context context, float dp) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dp * scale + 0.5f);
}
/**
* @param context
* @param px
* @return
*/
public static int px2dip(Context context, float px) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (px / scale + 0.5f);
}
/**
* @param context
* @param spValue
* @return
*/
public static int sp2px(Context context, float spValue) {
final float scale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * scale + 0.5f);
}
/**
* @param context
* @param pxValue
* @return
*/
public static int px2sp(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / scale + 0.5f);
}
/**
* @param context
*/
public static void notifyScanMediaFiles(Context context) {
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
+ Environment.getExternalStorageDirectory())));
}
/**
* @return
*/
public static boolean isExternalStorageAvailable() {
return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || !isExternalStorageRemovable();
}
/**
* @return
*/
static boolean isExternalStorageRemovable() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
return Environment.isExternalStorageRemovable();
}
return true;
}
/**
* @return
*/
public static long getAvailableExternalStorageSize() {
return RLAPICompat.getAvailableBlocks() * RLAPICompat.getBlockSize();
}
/**
* @return
*/
public static long getTotalExternalStorageSize() {
return RLAPICompat.getFreeBlocks() * RLAPICompat.getBlockSize();
}
/**
* @param context
* @return
*/
public static String getExternalCacheDir(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) {
File f1 = context.getExternalCacheDir();
if (f1 != null) {
return f1.getPath();
} else {
return null;
}
} else {
final String cacheDir = "/Android/data/" + context.getPackageName() + "/cache/";
File f2 = Environment.getExternalStorageDirectory();
if (f2 != null) {
return f2.getPath() + cacheDir;
} else {
return null;
}
}
}
/**
* @param path
* @return
*/
public static boolean requestRootPermission(String path) {
Process process = null;
DataOutputStream dos = null;
try {
process = Runtime.getRuntime().exec("su");
if (process == null) {
return false;
}
OutputStream os = process.getOutputStream();
if (os == null) {
return false;
}
dos = new DataOutputStream(os);
dos.writeBytes("chmod 777 -R " + path + "\n");
dos.writeBytes("exit\n");
dos.flush();
process.waitFor();
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
try {
if (dos != null) {
dos.close();
}
if (process != null) {
process.destroy();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return true;
}
}