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

Commit 2eb901a4 authored by Fabrice Di Meglio's avatar Fabrice Di Meglio
Browse files

Add user selectable Default Browser feature

- add Default Apps section in Apps / Advanced
- follow UX spec

This change depends on a Framework change which adds new APIs in PackageMaager
for setting and getting the default Browser App package name.

See bug #20144393

Change-Id: I2ff456eeaced9f740f4dd6fb6bccea6de6ea1308
parent c2ab9341
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -5657,6 +5657,7 @@
    <string name="keywords_emergency_app">emergency ice app default</string>
    <string name="keywords_all_apps">apps download applications system</string>
    <string name="keywords_app_permissions">apps permissions security</string>
    <string name="keywords_default_apps">apps default</string>
    <!-- Search keywords for different screen unlock modes : slide to unlock, password, pattern and PIN [CHAR LIMIT=none] -->
    <string name="keywords_lockscreen">slide password pattern pin</string>

@@ -6212,4 +6213,13 @@
        <item quantity="other"><xliff:g id="count" example="10">%d</xliff:g> apps can open their domain URLs</item>
    </plurals>

    <!-- Title for Default Apps settings [CHAR LIMIT=30] -->
    <string name="default_apps_title">Default Apps</string>

    <!-- Title for Default Browser settings [CHAR LIMIT=30] -->
    <string name="default_browser_title">Default Browser</string>

    <!-- Summary for No Default Browser settings [CHAR LIMIT=45] -->
    <string name="default_browser_title_none">No default Browser</string>

</resources>
+6 −0
Original line number Diff line number Diff line
@@ -19,6 +19,12 @@
    xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
    android:key="applications_settings">

    <PreferenceScreen
        android:key="default_apps"
        android:fragment="com.android.settings.applications.ManageDefaultApps"
        android:title="@string/default_apps_title"
        settings:keywords="@string/keywords_default_apps" />

    <PreferenceScreen
        android:key="manage_perms"
        android:fragment="com.android.settings.applications.ManagePermissions"
+28 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2015 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.
-->

<PreferenceScreen
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
        android:key="default_apps">

    <com.android.settings.applications.DefaultBrowserPreference
            android:key="default_browser"
            android:title="@string/default_browser_title"
            android:summary="@string/default_browser_title_none"
            />

</PreferenceScreen>
+3 −1
Original line number Diff line number Diff line
@@ -23,9 +23,11 @@ import com.android.internal.logging.MetricsLogger;
 * Instrumented fragment that logs visibility state.
 */
public abstract class InstrumentedFragment extends PreferenceFragment {
    // Declare new temproary categories here, starting after this value.
    // Declare new temporary categories here, starting after this value.
    public static final int VIEW_CATEGORY_UNDECLARED = 100000;

    public static final int VIEW_CATEGORY_DEFAULT_APPS = VIEW_CATEGORY_UNDECLARED + 1;

    /**
     * Declare the view of this category.
     *
+81 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2015 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.applications;

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.UserHandle;
import android.preference.ListPreference;
import android.util.ArrayMap;
import android.util.AttributeSet;

import com.android.settings.R;

import java.util.List;

public class DefaultBrowserPreference extends ListPreference {

    final private PackageManager mPm;

    public DefaultBrowserPreference(Context context, AttributeSet attrs) {
        super(context, attrs);

        mPm = context.getPackageManager();
        loadBrowserApps();
    }

    private void loadBrowserApps() {
        ArrayMap<String, CharSequence> browsers = resolveBrowserApps();

        setEntries(browsers.values().toArray(new CharSequence[browsers.size()]));
        setEntryValues(browsers.keySet().toArray(new String[browsers.size()]));
    }

    private ArrayMap<String, CharSequence> resolveBrowserApps() {
        ArrayMap<String, CharSequence> result = new ArrayMap<>();

        // Create an Intent that will match ALL Browser Apps
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.addCategory(Intent.CATEGORY_BROWSABLE);
        intent.setData(Uri.parse("http:"));

        // Resolve that intent and check that the handleAllWebDataURI boolean is set
        PackageManager packageManager = getContext().getPackageManager();
        List<ResolveInfo> list = packageManager.queryIntentActivitiesAsUser(intent, 0,
                UserHandle.myUserId());

        final int count = list.size();
        for (int i=0; i<count; i++) {
            ResolveInfo info = list.get(i);
            if (info.activityInfo == null || result.containsKey(info.activityInfo.packageName)
                    || !info.handleAllWebDataURI) {
                continue;
            }

            String packageName = info.activityInfo.packageName;
            CharSequence label = info.activityInfo.applicationInfo.loadLabel(packageManager);

            result.put(packageName, label);
        }

        return result;
    }
}
Loading