package me.piebridge.brevent.ui;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import java.util.Locale;
/**
* Created by thom on 2017/1/31.
*/
public class AppsLabelLoader {
private static final char[] WHITESPACE = ("\u0085\u00a0\u1680"
+ "\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a"
+ "\u2028\u2029\u202f\u205f\u3000").toCharArray();
private static final String KEY_LAST_SYNC = "lastSync";
private long mLastUpdateTime;
private final long mLastSync;
private final SharedPreferences mPreferences;
public AppsLabelLoader(Context context) {
mPreferences =
context.getSharedPreferences("label-" + Locale.getDefault(), Context.MODE_PRIVATE);
mLastSync = mPreferences.getLong(KEY_LAST_SYNC, 0);
}
public String loadLabel(PackageManager packageManager, PackageInfo packageInfo) {
ApplicationInfo applicationInfo = packageInfo.applicationInfo;
long lastUpdateTime = packageInfo.lastUpdateTime;
if (lastUpdateTime > mLastUpdateTime) {
mLastUpdateTime = lastUpdateTime;
}
String packageName = packageInfo.packageName;
if (lastUpdateTime <= mLastSync && mPreferences.contains(packageName)) {
return mPreferences.getString(packageName, packageName);
} else {
Intent launchIntent =
packageManager.getLaunchIntentForPackage(applicationInfo.packageName);
CharSequence label;
if (launchIntent == null) {
label = applicationInfo.loadLabel(packageManager);
} else {
label = packageManager.resolveActivity(launchIntent, 0).activityInfo.loadLabel(
packageManager);
}
String name = trim(label).toString();
if (!label.equals(mPreferences.getString(packageName, null))) {
mPreferences.edit().putString(packageName, name).apply();
}
return name;
}
}
public void onCompleted() {
if (mLastSync < mLastUpdateTime) {
mPreferences.edit().putLong(KEY_LAST_SYNC, mLastUpdateTime).apply();
}
}
private static boolean isWhiteSpace(char s) {
if (s <= ' ') {
return true;
}
for (char c : WHITESPACE) {
if (c == s) {
return true;
}
}
return false;
}
private static CharSequence trim(CharSequence cs) {
if (cs != null) {
int last = cs.length() - 1;
int start = 0;
int end = last;
while (start <= end && isWhiteSpace(cs.charAt(start))) {
++start;
}
while (end >= start && isWhiteSpace(cs.charAt(end))) {
--end;
}
if (start != 0 || end != last) {
return cs.subSequence(start, end + 1);
}
}
return cs;
}
}