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

Commit 40d411ab authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Update launch intent flags for settings shortcut widgets." into pi-dev

parents 220a6a00 f2d7680d
Loading
Loading
Loading
Loading
+25 −2
Original line number Diff line number Diff line
@@ -22,11 +22,15 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.content.pm.UserInfo;
import android.os.UserHandle;
import android.os.UserManager;
import android.support.annotation.VisibleForTesting;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;

import static android.content.pm.PackageManager.GET_ACTIVITIES;
@@ -39,8 +43,8 @@ import com.android.settings.shortcut.CreateShortcut;
/**
 * Listens to {@link Intent.ACTION_PRE_BOOT_COMPLETED} and {@link Intent.ACTION_USER_INITIALIZED}
 * performs setup steps for a managed profile (disables the launcher icon of the Settings app,
 * adds cross-profile intent filters for the appropriate Settings activities), and disables the
 * webview setting for non-admin users.
 * adds cross-profile intent filters for the appropriate Settings activities), disables the
 * webview setting for non-admin users, and updates the intent flags for any existing shortcuts.
 */
public class SettingsInitialize extends BroadcastReceiver {
    private static final String TAG = "Settings";
@@ -56,6 +60,7 @@ public class SettingsInitialize extends BroadcastReceiver {
        final PackageManager pm  = context.getPackageManager();
        managedProfileSetup(context, pm, broadcast, userInfo);
        webviewSettingSetup(context, pm, userInfo);
        refreshExistingShortcuts(context);
    }

    private void managedProfileSetup(Context context, final PackageManager pm, Intent broadcast,
@@ -113,4 +118,22 @@ public class SettingsInitialize extends BroadcastReceiver {
                        PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);
    }

    // Refresh settings shortcuts to have correct intent flags
    @VisibleForTesting
    void refreshExistingShortcuts(Context context) {
        final ShortcutManager shortcutManager = context.getSystemService(ShortcutManager.class);
        final List<ShortcutInfo> pinnedShortcuts = shortcutManager.getPinnedShortcuts();
        final List<ShortcutInfo> updates = new ArrayList<>();
        for (ShortcutInfo info : pinnedShortcuts) {
            final Intent shortcutIntent = info.getIntent();
            shortcutIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
            final ShortcutInfo updatedInfo = new ShortcutInfo.Builder(context, info.getId())
                    .setIntent(shortcutIntent)
                    .build();
            updates.add(updatedInfo);
        }
        shortcutManager.updateShortcuts(updates);
    }

}
+79 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * 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.android.settings;

import static com.google.common.truth.Truth.assertThat;

import android.content.Context;
import android.content.Intent;
import android.content.pm.ShortcutInfo;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowShortcutManager;
import java.util.ArrayList;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;

@RunWith(SettingsRobolectricTestRunner.class)
@Config(shadows = {ShadowShortcutManager.class})
public class SettingsInitializeTest {

    private Context mContext;
    private SettingsInitialize mSettingsInitialize;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);

        mContext = RuntimeEnvironment.application;
        mSettingsInitialize = new SettingsInitialize();
    }

    @Test
    public void refreshExistingShortcuts_shouldUpdateLaunchIntentFlagsForExistingShortcut() {
        final String id = "test_shortcut_id";
        final Intent intent = new Intent(Intent.ACTION_DEFAULT);
        intent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
        final ShortcutInfo info = new ShortcutInfo.Builder(mContext, id)
                .setShortLabel("test123")
                .setIntent(intent)
                .build();
        final List<ShortcutInfo> shortcuts = new ArrayList<>();
        shortcuts.add(info);
        ShadowShortcutManager.get().setPinnedShortcuts(shortcuts);

        mSettingsInitialize.refreshExistingShortcuts(mContext);

        final List<ShortcutInfo> updatedShortcuts =
                ShadowShortcutManager.get().getLastUpdatedShortcuts();
        assertThat(updatedShortcuts).hasSize(1);
        final ShortcutInfo updateInfo = updatedShortcuts.get(0);
        assertThat(updateInfo.getId()).isEqualTo(id);
        final int flags = updateInfo.getIntent().getFlags();
        // The original flag should be removed
        assertThat(flags & Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED).isEqualTo(0);
        // The new flags should be set
        assertThat(flags & Intent.FLAG_ACTIVITY_NEW_TASK).isEqualTo(Intent.FLAG_ACTIVITY_NEW_TASK);
        assertThat(flags & Intent.FLAG_ACTIVITY_CLEAR_TOP).isEqualTo(
                Intent.FLAG_ACTIVITY_CLEAR_TOP);
    }
}
+63 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * 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.android.settings.testutils.shadow;

import static org.robolectric.RuntimeEnvironment.application;

import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import java.util.List;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.annotation.Resetter;
import org.robolectric.shadow.api.Shadow;

@Implements(ShortcutManager.class)
public class ShadowShortcutManager extends org.robolectric.shadows.ShadowShortcutManager {

    private List<ShortcutInfo> mPinnedShortcuts;
    private List<ShortcutInfo> mLastUpdatedShortcuts;

    @Resetter
    public void reset() {
        mPinnedShortcuts = null;
        mLastUpdatedShortcuts = null;
    }

    public static ShadowShortcutManager get() {
        return Shadow.extract(application.getSystemService(ShortcutManager.class));
    }

    @Implementation
    public boolean updateShortcuts(List<ShortcutInfo> shortcutInfoList) {
        mLastUpdatedShortcuts = shortcutInfoList;
        return true;
    }

    public List<ShortcutInfo> getLastUpdatedShortcuts() {
        return mLastUpdatedShortcuts;
    }

    @Implementation
    public List<ShortcutInfo> getPinnedShortcuts() {
        return mPinnedShortcuts;
    }

    public void setPinnedShortcuts(List<ShortcutInfo> shortcutInfos) {
        mPinnedShortcuts = shortcutInfos;
    }
}