package com.android.systemui.cm; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.res.Resources; import android.database.ContentObserver; import android.graphics.Bitmap; import android.graphics.ColorFilter; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Handler; import android.os.Looper; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; import com.android.systemui.R; import cyanogenmod.providers.CMSettings; public class LockscreenShortcutsHelper { private Handler mHandler; public enum Shortcuts { LEFT_SHORTCUT(0), RIGHT_SHORTCUT(1); private final int index; Shortcuts(int index) { this.index = index; } } public static final String DEFAULT = "default"; public static final String NONE = "none"; private static final String DELIMITER = "|"; private final Context mContext; private OnChangeListener mListener; private List<String> mTargetActivities; public interface OnChangeListener { void onChange(); } public LockscreenShortcutsHelper(Context context, OnChangeListener listener) { mContext = context; if (listener != null) { mListener = listener; mHandler = new Handler(Looper.getMainLooper()); mContext.getContentResolver().registerContentObserver( CMSettings.Secure.getUriFor(CMSettings.Secure.LOCKSCREEN_TARGETS), false, mObserver); } fetchTargets(); } private ContentObserver mObserver = new ContentObserver(null) { @Override public void onChange(boolean selfChange, Uri uri) { fetchTargets(); if (mListener != null && mHandler != null) { mHandler.post(new Runnable() { @Override public void run() { mListener.onChange(); } }); } } }; public void cleanup() { mContext.getContentResolver().unregisterContentObserver(mObserver); mListener = null; } public static class TargetInfo { public Drawable icon; public ColorFilter colorFilter; public String uri; public TargetInfo(Drawable icon, ColorFilter colorFilter, String uri) { this.icon = icon; this.colorFilter = colorFilter; this.uri = uri; } } private void fetchTargets() { mTargetActivities = CMSettings.Secure.getDelimitedStringAsList(mContext.getContentResolver(), CMSettings.Secure.LOCKSCREEN_TARGETS, DELIMITER); int itemsToPad = Shortcuts.values().length - mTargetActivities.size(); if (itemsToPad > 0) { for (int i = 0; i < itemsToPad; i++) { mTargetActivities.add(DEFAULT); } } } public Drawable getDrawableForTarget(Shortcuts shortcut) { Intent intent = getIntent(shortcut); if (intent != null) { PackageManager pm = mContext.getPackageManager(); ActivityInfo info = intent.resolveActivityInfo(pm, PackageManager.GET_ACTIVITIES); if (info != null) { return getScaledDrawable(info.loadIcon(pm)); } } return null; } public String getUriForTarget(Shortcuts shortcuts) { return mTargetActivities.get(shortcuts.index); } private Drawable getScaledDrawable(Drawable drawable) { if (drawable instanceof BitmapDrawable) { Resources res = mContext.getResources(); int width = res.getDimensionPixelSize(R.dimen.keyguard_affordance_icon_width); int height = res.getDimensionPixelSize(R.dimen.keyguard_affordance_icon_height); return new BitmapDrawable(mContext.getResources(), Bitmap.createScaledBitmap(((BitmapDrawable) drawable).getBitmap(), width, height, true)); } else { return drawable; } } private String getFriendlyActivityName(Intent intent, boolean labelOnly) { PackageManager pm = mContext.getPackageManager(); ActivityInfo ai = intent.resolveActivityInfo(pm, PackageManager.GET_ACTIVITIES); String friendlyName = null; if (ai != null) { friendlyName = ai.loadLabel(pm).toString(); if (friendlyName == null && !labelOnly) { friendlyName = ai.name; } } return friendlyName != null || labelOnly ? friendlyName : intent.toUri(0); } private String getFriendlyShortcutName(Intent intent) { String activityName = getFriendlyActivityName(intent, true); String name = intent.getStringExtra(Intent.EXTRA_SHORTCUT_NAME); if (activityName != null && name != null) { return activityName + ": " + name; } return name != null ? name : intent.toUri(0); } public String getFriendlyNameForUri(Shortcuts shortcut) { Intent intent = getIntent(shortcut); if (Intent.ACTION_MAIN.equals(intent.getAction())) { return getFriendlyActivityName(intent, false); } return getFriendlyShortcutName(intent); } public boolean isTargetCustom(Shortcuts shortcut) { if (mTargetActivities == null || mTargetActivities.isEmpty()) { return false; } String action = mTargetActivities.get(shortcut.index); if (DEFAULT.equals(action)) { return false; } return NONE.equals(action) || getIntent(shortcut) != null; } public boolean isTargetEmpty(Shortcuts shortcut) { return mTargetActivities != null && !mTargetActivities.isEmpty() && mTargetActivities.get(shortcut.index).equals(NONE); } public Intent getIntent(Shortcuts shortcut) { Intent intent = null; try { intent = Intent.parseUri(mTargetActivities.get(shortcut.index), 0); } catch (URISyntaxException e) { e.printStackTrace(); } return intent; } public void saveTargets(ArrayList<String> targets) { CMSettings.Secure.putListAsDelimitedString(mContext.getContentResolver(), CMSettings.Secure.LOCKSCREEN_TARGETS, DELIMITER, targets); } }