Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 01ac1922 authored by Danesh M's avatar Danesh M Committed by Gerrit Code Review
Browse files

SystemUI: Lockscreen shortcut customization

Change-Id: I4abf1deed0a342e111453516fa7820191a55ffc4
parent 6b774d7c
Loading
Loading
Loading
Loading
+6 −0
Original line number Original line Diff line number Diff line
@@ -4383,6 +4383,12 @@ public final class Settings {
         */
         */
        public static final String INSTALL_NON_MARKET_APPS = "install_non_market_apps";
        public static final String INSTALL_NON_MARKET_APPS = "install_non_market_apps";


        /**
         * Launch actions for left/right lockscreen targets
         * @hide
         */
        public static final String LOCKSCREEN_TARGETS = "lockscreen_target_actions";

        /**
        /**
         * Comma-separated list of location providers that activities may access. Do not rely on
         * Comma-separated list of location providers that activities may access. Do not rely on
         * this value being present in settings.db or on ContentObserver notifications on the
         * this value being present in settings.db or on ContentObserver notifications on the
+210 −0
Original line number Original line Diff line number Diff line
package com.android.internal.util.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.ColorFilter;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.provider.Settings;
import android.text.TextUtils;

import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;

public class LockscreenShortcutsHelper {

    public enum Shortcuts {
        LEFT_SHORTCUT(0),
        RIGHT_SHORTCUT(1);

        private final int index;

        private Shortcuts(int index) {
            this.index = index;
        }
    }

    public static final String NONE = "none";
    private static final String DELIMITER = "|";
    private static final String SYSTEM_UI_PKGNAME = "com.android.systemui";
    private static final String PHONE_DEFAULT_ICON = "ic_phone_24dp";
    private static final String CAMERA_DEFAULT_ICON = "ic_camera_alt_24dp";

    private final Context mContext;
    private OnChangeListener mListener;
    private List<String> mTargetActivities;

    public interface OnChangeListener {
        public void onChange();
    }

    public LockscreenShortcutsHelper(Context context, OnChangeListener listener) {
        mContext = context;
        if (listener != null) {
            mListener = listener;
            mContext.getContentResolver().registerContentObserver(
                    Settings.Secure.getUriFor(Settings.Secure.LOCKSCREEN_TARGETS), false, mObserver);
        }
        fetchTargets();
    }

    private ContentObserver mObserver = new ContentObserver(null) {
        @Override
        public void onChange(boolean selfChange, Uri uri) {
            fetchTargets();
            if (mListener != null) {
                mListener.onChange();
            }
        }
    };

    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 = Settings.Secure.getDelimitedStringAsList(mContext.getContentResolver(),
                Settings.Secure.LOCKSCREEN_TARGETS, DELIMITER);
        int itemsToPad = Shortcuts.values().length - mTargetActivities.size();
        if (itemsToPad > 0) {
            for (int i = 0; i < itemsToPad; i++) {
                mTargetActivities.add(NONE);
            }
        }

    }

    public List<TargetInfo> getDrawablesForTargets() {
        fetchTargets();
        List<TargetInfo> result = new ArrayList<TargetInfo>();

        ColorMatrix cm = new ColorMatrix();
        cm.setSaturation(0);
        ColorMatrixColorFilter filter = new ColorMatrixColorFilter(cm);
        ColorFilter filerToSet = null;

        for (int i = 0; i < Shortcuts.values().length; i++) {
            String activity = mTargetActivities.get(i);
            Drawable drawable = null;

            if (!TextUtils.isEmpty(activity) && !activity.equals(NONE)) {
                // No pre-defined action, try to resolve URI
                try {
                    Intent intent = Intent.parseUri(activity, 0);
                    PackageManager pm = mContext.getPackageManager();
                    ActivityInfo info = intent.resolveActivityInfo(pm, PackageManager.GET_ACTIVITIES);

                    if (info != null) {
                        drawable = info.loadIcon(pm);
                        filerToSet = filter;
                    }
                } catch (URISyntaxException e) {
                    e.printStackTrace();
                    // Treat as empty
                }
            }

            if (drawable == null) {
                drawable = getDrawableFromSystemUI(i == Shortcuts.LEFT_SHORTCUT.index
                        ? PHONE_DEFAULT_ICON : CAMERA_DEFAULT_ICON);
                filerToSet = null;
            }

            result.add(new TargetInfo(drawable, filerToSet, activity));
        }
        return result;
    }

    public Drawable getDrawableFromSystemUI(String name) {
        Resources res = null;
        Context context = mContext;
        if (context.getPackageName().equals(SYSTEM_UI_PKGNAME)) {
            res = context.getResources();
        } else {
            try {
                context = context.createPackageContext(SYSTEM_UI_PKGNAME,
                        Context.CONTEXT_IGNORE_SECURITY);
                res = context.getResources();
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
        }
        if (res == null) {
            return null;
        }
        int id = res.getIdentifier(name, "drawable", SYSTEM_UI_PKGNAME);
        if (id > 0) {
            return res.getDrawable(id);
        }
        return null;
    }

    private String getFriendlyActivityName(Intent intent, boolean labelOnly) {
        PackageManager packageManager = mContext.getPackageManager();
        ActivityInfo ai = intent.resolveActivityInfo(packageManager, PackageManager.GET_ACTIVITIES);
        String friendlyName = null;
        if (ai != null) {
            friendlyName = ai.loadLabel(packageManager).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) {
        return mTargetActivities != null &&
                !mTargetActivities.isEmpty() &&
                !mTargetActivities.get(shortcut.index).equals(NONE);
    }

    public Intent getIntent(Shortcuts shortcut) {
        Intent intent = null;
        if (isTargetCustom(shortcut)) {
            try {
                intent = Intent.parseUri(mTargetActivities.get(shortcut.index), 0);
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
        }
        return intent;
    }

    public void saveTargets(ArrayList<String> targets) {
        Settings.Secure.putListAsDelimitedString(mContext.getContentResolver(),
                Settings.Secure.LOCKSCREEN_TARGETS, DELIMITER, targets);
    }

}
+1 −1
Original line number Original line Diff line number Diff line
@@ -6,7 +6,7 @@ LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src) \
LOCAL_SRC_FILES := $(call all-java-files-under, src) \
    src/com/android/systemui/EventLogTags.logtags
    src/com/android/systemui/EventLogTags.logtags


LOCAL_STATIC_JAVA_LIBRARIES := Keyguard
LOCAL_STATIC_JAVA_LIBRARIES := Keyguard android-support-v7-palette android-support-v4
LOCAL_JAVA_LIBRARIES := telephony-common
LOCAL_JAVA_LIBRARIES := telephony-common


LOCAL_PACKAGE_NAME := SystemUI
LOCAL_PACKAGE_NAME := SystemUI
+0 −2
Original line number Original line Diff line number Diff line
@@ -44,7 +44,6 @@
        android:layout_height="@dimen/keyguard_affordance_height"
        android:layout_height="@dimen/keyguard_affordance_height"
        android:layout_width="@dimen/keyguard_affordance_width"
        android:layout_width="@dimen/keyguard_affordance_width"
        android:layout_gravity="bottom|end"
        android:layout_gravity="bottom|end"
        android:tint="#ffffffff"
        android:src="@drawable/ic_camera_alt_24dp"
        android:src="@drawable/ic_camera_alt_24dp"
        android:scaleType="center"
        android:scaleType="center"
        android:contentDescription="@string/accessibility_camera_button" />
        android:contentDescription="@string/accessibility_camera_button" />
@@ -54,7 +53,6 @@
        android:layout_height="@dimen/keyguard_affordance_height"
        android:layout_height="@dimen/keyguard_affordance_height"
        android:layout_width="@dimen/keyguard_affordance_width"
        android:layout_width="@dimen/keyguard_affordance_width"
        android:layout_gravity="bottom|start"
        android:layout_gravity="bottom|start"
        android:tint="#ffffffff"
        android:src="@drawable/ic_phone_24dp"
        android:src="@drawable/ic_phone_24dp"
        android:scaleType="center"
        android:scaleType="center"
        android:contentDescription="@string/accessibility_phone_button" />
        android:contentDescription="@string/accessibility_phone_button" />
+4 −0
Original line number Original line Diff line number Diff line
@@ -94,4 +94,8 @@


    <!-- Weather string format in expanded statusbar header -->
    <!-- Weather string format in expanded statusbar header -->
    <string name="status_bar_expanded_header_weather_format"><xliff:g id="temp">%1$s</xliff:g> - <xliff:g id="condition">%2$s</xliff:g></string>
    <string name="status_bar_expanded_header_weather_format"><xliff:g id="temp">%1$s</xliff:g> - <xliff:g id="condition">%2$s</xliff:g></string>

    <string name="left_shortcut_hint">Swipe right for %1$s</string>
    <string name="right_shortcut_hint">Swipe left for %1$s</string>

</resources>
</resources>
Loading