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

Commit e2f7ef53 authored by Danesh Mondegarian's avatar Danesh Mondegarian Committed by Gerrit Code Review
Browse files

LockscreenTile : Don't rely on DEVICE_POLICY broadcast

The current trigger used for initialization is too finicky and doesn't
work on some devices. Switch to trigger based on instantiation of the service
inside the delegate instead.

Also fix inverted drawable state.

Change-Id: I8439ed50281de805ae68fe7b5a81220475d98022
parent 6771d0cd
Loading
Loading
Loading
Loading
+37 −34
Original line number Diff line number Diff line
@@ -6,19 +6,20 @@ import java.util.List;

import android.app.KeyguardManager;
import android.app.KeyguardManager.KeyguardLock;
import android.app.admin.DevicePolicyManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;

import com.android.systemui.statusbar.phone.KeyguardTouchDelegate;

@SuppressWarnings("deprecation")
public class LockscreenStateChanger {
    private static final String KEYGUARD_SERVICE_ACTION_STATE_CHANGE =
            "com.android.internal.action.KEYGUARD_SERVICE_STATE_CHANGED";
    private static final String KEYGUARD_SERVICE_EXTRA_ACTIVE = "active";

    private static final String KEY_DISABLED = "lockscreen_disabled";

    public interface LockStateChangeListener {
        public void onLockStateChange(boolean enabled);
    }
@@ -28,7 +29,7 @@ public class LockscreenStateChanger {
    private static LockscreenStateChanger sInstance;
    private Context mContext;
    private KeyguardLock mLock;
    private boolean mInitialized;
    private boolean mKeyguardBound;
    private SharedPreferences mPrefs;

    public static synchronized LockscreenStateChanger getInstance(Context context) {
@@ -41,12 +42,15 @@ public class LockscreenStateChanger {
    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            mContext.unregisterReceiver(this);
            mInitialized = true;
            updateForCurrentState();
            updateBasedOnIntent(intent);
        }
    };

    private void updateBasedOnIntent(Intent intent) {
        mKeyguardBound = intent.getBooleanExtra(KEYGUARD_SERVICE_EXTRA_ACTIVE, false);
        updateForCurrentState();
    }

    private LockscreenStateChanger(Context context) {
        mListeners = Collections.synchronizedList(new ArrayList<LockStateChangeListener>());
        mContext = context.getApplicationContext();
@@ -57,37 +61,47 @@ public class LockscreenStateChanger {
        // Fetch last state
        mPrefs = mContext.getSharedPreferences("quicksettings", Context.MODE_PRIVATE);
        mLockscreenDisabled = mPrefs.getBoolean(KEY_DISABLED, false);
        if (!isInitialized()) {
            // Register receiver
            IntentFilter filter = new IntentFilter(DevicePolicyManager
                    .ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
            mContext.registerReceiver(mReceiver, filter);
        } else {
            updateForCurrentState();
    }

    private void registerReceiver() {
        IntentFilter filter = new IntentFilter(KEYGUARD_SERVICE_ACTION_STATE_CHANGE);
        Intent i = mContext.registerReceiver(mReceiver, filter);
        if (i != null) {
            updateBasedOnIntent(i);
        }
    }

    public synchronized void addListener(LockStateChangeListener listener) {
        if (mListeners.isEmpty()) {
            registerReceiver();
            updateForCurrentState();
        }
        mListeners.add(listener);
    }

    public synchronized void removeListener(LockStateChangeListener listener) {
        mListeners.remove(listener);
        if (mListeners.isEmpty() && mLockscreenDisabled) {
            // No more tiles left, lets re-enable keyguard
        if (mListeners.isEmpty()) {
            if (mLockscreenDisabled) {
                // No more tiles left, let's re-enable keyguard
                toggleState();
            }
            mContext.unregisterReceiver(mReceiver);
        }
    }

    public synchronized void toggleState() {
        mLockscreenDisabled = !mLockscreenDisabled;
        mPrefs.edit().putBoolean(KEY_DISABLED, mLockscreenDisabled).apply();

        updateForCurrentState();
    }

    private synchronized void updateForCurrentState() {
        boolean dpmInitialized = isInitialized();
        if (dpmInitialized) {
            mPrefs.edit().putBoolean(KEY_DISABLED, mLockscreenDisabled).apply();
        if (!mKeyguardBound) {
            return;
        }

        if (mLockscreenDisabled) {
            mLock.disableKeyguard();
        } else {
@@ -95,17 +109,6 @@ public class LockscreenStateChanger {
        }
        informListeners();
    }
    }

    private boolean isInitialized() {
        if (!mInitialized) {
            KeyguardTouchDelegate keyguard = KeyguardTouchDelegate.getInstance(mContext);
            if (keyguard.isServiceInitialized()) {
                mInitialized = true;
            }
        }
        return mInitialized;
    }

    private void informListeners() {
        for (LockStateChangeListener listener : mListeners) {
+1 −1
Original line number Diff line number Diff line
@@ -44,7 +44,7 @@ public class ToggleLockscreenTile extends QuickSettingsTile implements
    public void updateResources() {
        mLabel = mContext.getString(R.string.quick_settings_lockscreen);
        mDrawable = mLockscreenChanger.isDisabled() ?
                R.drawable.ic_qs_lock_screen_on : R.drawable.ic_qs_lock_screen_off;
                R.drawable.ic_qs_lock_screen_off : R.drawable.ic_qs_lock_screen_on;
        super.updateResources();
    }

+0 −4
Original line number Diff line number Diff line
@@ -185,8 +185,4 @@ public class KeyguardTouchDelegate {
            Slog.w(TAG, "dismiss(): NO SERVICE!");
        }
    }

    public boolean isServiceInitialized() {
        return mService != null;
    }
}
+14 −1
Original line number Diff line number Diff line
@@ -29,8 +29,12 @@ import com.android.internal.widget.LockPatternUtils;
 * local or remote instances of keyguard.
 */
public class KeyguardServiceDelegate {

    private static final String TAG = "KeyguardServiceDelegate";

    private static final String ACTION_STATE_CHANGE =
            "com.android.internal.action.KEYGUARD_SERVICE_STATE_CHANGED";
    private static final String EXTRA_ACTIVE = "active";

    private static final boolean DEBUG = false;
    protected KeyguardServiceWrapper mKeyguardService;
    private View mScrim; // shown if keyguard crashes
@@ -116,6 +120,12 @@ public class KeyguardServiceDelegate {
        }
    }

    private void sendStateChangeBroadcast(boolean bound) {
        Intent i = new Intent(ACTION_STATE_CHANGE);
        i.putExtra(EXTRA_ACTIVE, bound);
        mScrim.getContext().sendStickyBroadcast(i);
    }

    private final ServiceConnection mKeyguardConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
@@ -130,6 +140,7 @@ public class KeyguardServiceDelegate {
            }
            if (mKeyguardState.bootCompleted) {
                mKeyguardService.onBootCompleted();
                sendStateChangeBroadcast(true);
            }
        }

@@ -137,6 +148,7 @@ public class KeyguardServiceDelegate {
        public void onServiceDisconnected(ComponentName name) {
            if (DEBUG) Log.v(TAG, "*** Keyguard disconnected (boo!)");
            mKeyguardService = null;
            sendStateChangeBroadcast(false);
        }

    };
@@ -322,6 +334,7 @@ public class KeyguardServiceDelegate {
    public void onBootCompleted() {
        if (mKeyguardService != null) {
            mKeyguardService.onBootCompleted();
            sendStateChangeBroadcast(true);
        }
        mKeyguardState.bootCompleted = true;
    }