OSDN Git Service

Add BT message access
authorPauloftheWest <paulofthewest@google.com>
Tue, 1 Jul 2014 12:19:58 +0000 (05:19 -0700)
committerPauloftheWest <paulofthewest@google.com>
Fri, 11 Jul 2014 22:55:00 +0000 (15:55 -0700)
+ List available email accounts
+ Allow for turning each account on/off with switches--making the message content available to bluetooth devices that can read emails (like cars)

Bug: 15720425

Change-Id: Ia0c91c1e74a2644fc99a8b902c42212453d8f86e

res/values/strings.xml
res/xml/bluetooth_message_access.xml [new file with mode: 0644]
src/com/android/settings/SettingsActivity.java
src/com/android/settings/bluetooth/BluetoothSettings.java
src/com/android/settings/bluetooth/MessageAccessSettings.java [new file with mode: 0644]
src/com/android/settings/search/Ranking.java
src/com/android/settings/search/SearchIndexableResources.java

index b52f40d..8663972 100644 (file)
     <string name="bluetooth_notif_message">Touch to pair with <xliff:g id="device_name">%1$s</xliff:g>.</string>
     <!-- Bluetooth settings screen, menu to show the list of received files [CHAR LIMIT=30] -->
     <string name="bluetooth_show_received_files">Show received files</string>
+    <!-- Bluetooth settings screen, menu to show the list of email accounts to pull messages from [CHAR LIMIT=30] -->
+    <string name="bluetooth_show_message_access">Message access</string>
 
     <!-- Strings for BluetoothDevicePicker -->
     <string name="device_picker">Bluetooth device chooser</string>
     <!-- Strings for asking to the user whether to allow an app to enable bluetooth -->
     <string name="bluetooth_ask_enablement">An app wants to turn on Bluetooth.</string>
 
+    <!-- String for informing the user that bluetooth devices must be granted permission. [CHAR LIMIT=100] -->
+    <string name="bluetooth_message_access_notice">Bluetooth devices must ask for permission before accessing available accounts.</string>
     <!-- Strings for asking to the user whether to allow an app to enable discovery mode -->
     <string name="bluetooth_ask_discovery" product="tablet">An app wants to make your tablet visible to other Bluetooth devices for <xliff:g id="timeout">%1$d</xliff:g> seconds.</string>
     <!-- Strings for asking to the user whether to allow an app to enable discovery mode -->
     <string name="bluetooth_preference_device_settings">Device settings</string>
     <!-- Bluetooth settings: The sub heading for devices which have already been paired with this device. [CHAR LIMIT=40] -->
     <string name="bluetooth_preference_paired_devices">Paired devices</string>
+    <!-- Bluetooth settings: The sub heading for messaging accesses. [CHAR LIMIT=50] -->
+    <string name="bluetooth_message_access">Paired devices can view messages from</string>
     <!-- Bluetooth settings: The sub heading for available devices during and after scanning. [CHAR LIMIT=40] -->
     <string name="bluetooth_preference_found_devices">Available devices</string>
     <!-- Bluetooth settings.  Context menu item for a device.  Action will connect to all profiles on the device. -->
diff --git a/res/xml/bluetooth_message_access.xml b/res/xml/bluetooth_message_access.xml
new file mode 100644 (file)
index 0000000..d1da132
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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"
+        android:title="@string/bluetooth_show_message_access">
+
+    <PreferenceCategory
+            android:key="accounts"
+            android:title="@string/bluetooth_message_access" />
+
+    <Preference
+            android:key="notice"
+            android:title=""
+            android:textAppearance="?android:attr/textAppearanceSmall"
+            android:textColor="?android:attr/colorForegroundInverse"
+            android:selectable="false"
+            android:summary="@string/bluetooth_message_access_notice" />
+
+</PreferenceScreen>
index b0d3241..4675bb2 100644 (file)
@@ -76,6 +76,7 @@ import com.android.settings.applications.InstalledAppDetails;
 import com.android.settings.applications.ManageApplications;
 import com.android.settings.applications.ProcessStatsUi;
 import com.android.settings.bluetooth.BluetoothSettings;
+import com.android.settings.bluetooth.MessageAccessSettings;
 import com.android.settings.dashboard.DashboardCategory;
 import com.android.settings.dashboard.DashboardSummary;
 import com.android.settings.dashboard.DashboardTile;
@@ -237,6 +238,7 @@ public class SettingsActivity extends Activity
             AdvancedWifiSettings.class.getName(),
             SavedAccessPointsWifiSettings.class.getName(),
             BluetoothSettings.class.getName(),
+            MessageAccessSettings.class.getName(),
             TetherSettings.class.getName(),
             WifiP2pSettings.class.getName(),
             VpnSettings.class.getName(),
index f329c3d..8eee272 100755 (executable)
@@ -18,8 +18,6 @@ package com.android.settings.bluetooth;
 
 import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
 
-import android.app.ActionBar;
-import android.app.Activity;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
 import android.content.BroadcastReceiver;
@@ -33,12 +31,10 @@ import android.preference.PreferenceCategory;
 import android.preference.PreferenceGroup;
 import android.preference.PreferenceScreen;
 import android.util.Log;
-import android.view.Gravity;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
-import android.widget.Switch;
 import android.widget.TextView;
 
 import com.android.settings.R;
@@ -63,6 +59,7 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment implem
     private static final int MENU_ID_RENAME_DEVICE = Menu.FIRST + 1;
     private static final int MENU_ID_VISIBILITY_TIMEOUT = Menu.FIRST + 2;
     private static final int MENU_ID_SHOW_RECEIVED = Menu.FIRST + 3;
+    private static final int MENU_ID_MESSAGE_ACCESS = Menu.FIRST + 4;
 
     /* Private intent to show the list of received files */
     private static final String BTOPP_ACTION_OPEN_RECEIVED_FILES =
@@ -187,6 +184,12 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment implem
                 .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
         menu.add(Menu.NONE, MENU_ID_SHOW_RECEIVED, 0, R.string.bluetooth_show_received_files)
                 .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
+        // Message Access API is still not finished, once completed we undo this check.
+        // Bug 16232864
+        if (android.os.SystemProperties.get("show_bluetooth_message_access").equals("true")){
+            menu.add(Menu.NONE, MENU_ID_MESSAGE_ACCESS, 0, R.string.bluetooth_show_message_access)
+                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
+        }
         super.onCreateOptionsMenu(menu, inflater);
     }
 
@@ -213,6 +216,14 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment implem
                 Intent intent = new Intent(BTOPP_ACTION_OPEN_RECEIVED_FILES);
                 getActivity().sendBroadcast(intent);
                 return true;
+
+            case MENU_ID_MESSAGE_ACCESS:
+                if (getActivity() instanceof SettingsActivity) {
+                    ((SettingsActivity) getActivity()).startPreferencePanel(
+                            MessageAccessSettings.class.getCanonicalName(), null,
+                            R.string.bluetooth_show_message_access, null, this, 0);
+                }
+                return true;
         }
         return super.onOptionsItemSelected(item);
     }
@@ -355,6 +366,7 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment implem
         getActivity().invalidateOptionsMenu();
     }
 
+    @Override
     public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) {
         setDeviceListGroup(getPreferenceScreen());
         removeAllDevices();
@@ -433,5 +445,4 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment implem
                 return result;
             }
         };
-
 }
diff --git a/src/com/android/settings/bluetooth/MessageAccessSettings.java b/src/com/android/settings/bluetooth/MessageAccessSettings.java
new file mode 100644 (file)
index 0000000..bef59c8
--- /dev/null
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2014 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.bluetooth;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.app.ActivityManagerNative;
+import android.content.Context;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.preference.SwitchPreference;
+import android.preference.Preference;
+import android.preference.PreferenceGroup;
+import android.preference.PreferenceScreen;
+import android.provider.SearchIndexableResource;
+import android.util.Log;
+
+import com.android.settings.accounts.AuthenticatorHelper;
+import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.Utils;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.Indexable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MessageAccessSettings extends SettingsPreferenceFragment
+        implements AuthenticatorHelper.OnAccountsUpdateListener, Indexable {
+    private static final String TAG = "MessageAccessSettings";
+    private static final String GMAIL_PACKAGE_NAME = "com.google.android.gm";
+    private static final String EMAIL_PACKAGE_NAME = "com.google.android.email";
+
+    private Account[] mAccounts;
+    private UserHandle mUserHandle;
+    private PreferenceGroup mAvailableAccounts;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mUserHandle = Utils.getProfileToDisplay(ActivityManagerNative.getDefault(),
+                getActivity().getActivityToken(), savedInstanceState);
+
+        addPreferencesFromResource(R.xml.bluetooth_message_access);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        initPreferences();
+    }
+
+    @Override
+    public void onAccountsUpdate(final UserHandle userHandle) {
+        mAccounts = AccountManager.get(getActivity()).getAccountsAsUser(
+                mUserHandle.getIdentifier());
+
+        final int mAccountsSize = mAccounts.length;
+        for (int i = 0; i < mAccountsSize; ++i){
+            Log.d(TAG, String.format("account.type = %s\n", mAccounts[i].type));
+        }
+    }
+
+    /**
+     * Retrieves the email icon for a given account's email preference
+     *
+     * @param accountPref The user's account to retrieve the icon from.
+     *
+     * @return The drawable representing the icon of the user's email preference
+     **/
+    private Drawable getIcon(AccountPreference accountPref){
+        Drawable icon = null;
+
+        // Currently only two types of icons are allowed.
+        final String packageName = accountPref.account.type.equals("com.google")
+                ? GMAIL_PACKAGE_NAME : EMAIL_PACKAGE_NAME;
+
+        try{
+            icon = getPackageManager().getApplicationIcon(packageName);
+        }catch(NameNotFoundException nnfe){
+            icon = null;
+        }
+
+        return icon;
+    }
+
+    private void initPreferences() {
+        final PreferenceScreen preferenceScreen = getPreferenceScreen();
+        mAvailableAccounts = (PreferenceGroup)preferenceScreen.findPreference("accounts");
+        mAccounts = AccountManager.get(getActivity()).getAccountsAsUser(
+                mUserHandle.getIdentifier());
+
+        final int mAccountsSize = mAccounts.length;
+        for (int i = 0; i < mAccountsSize; ++i){
+            AccountPreference accountPref = new AccountPreference(getActivity(), mAccounts[i]);
+            Drawable icon = getIcon(accountPref);
+            if (icon != null){
+                accountPref.setIcon(icon);
+            }
+            mAvailableAccounts.addPreference(accountPref);
+        }
+    }
+
+    private class AccountPreference extends SwitchPreference
+            implements Preference.OnPreferenceChangeListener{
+        private Account account;
+
+        AccountPreference(Context context, Account account){
+            super(context);
+            this.account = account;
+            setTitle(account.type);
+            setSummary(account.name);
+
+            setOnPreferenceChangeListener(this);
+        }
+
+        @Override
+        public boolean onPreferenceChange(Preference preference, Object val) {
+            if (preference instanceof AccountPreference){
+                final AccountPreference accountPref = (AccountPreference) preference;
+
+                if (((Boolean)val).booleanValue()){
+                    // Enable paired deviced to connect, fill in once API is available
+                    Log.w(TAG, String.format(
+                                "User has turned on '%s' for Bluetooth message access.",
+                                accountPref.account.name));
+                } else {
+                    // Disable paired deviced to connect, fill in once API is available
+                    Log.w(TAG, String.format(
+                                "User has turned off '%s' for Bluetooth message access.",
+                                accountPref.account.name));
+                }
+            }
+            return true;
+        }
+    }
+
+    public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+        new BaseSearchIndexProvider() {
+            @Override
+            public List<SearchIndexableResource> getXmlResourcesToIndex(
+                    Context context, boolean enabled) {
+                List<SearchIndexableResource> indexables = new ArrayList<SearchIndexableResource>();
+                SearchIndexableResource indexable = new SearchIndexableResource(context);
+                indexable.xmlResId = R.xml.bluetooth_message_access;
+                indexables.add(indexable);
+                return indexables;
+            }
+        };
+}
index 0d53d85..fbb6f99 100644 (file)
@@ -30,6 +30,7 @@ import com.android.settings.WallpaperTypeSettings;
 import com.android.settings.WirelessSettings;
 import com.android.settings.accessibility.AccessibilitySettings;
 import com.android.settings.bluetooth.BluetoothSettings;
+import com.android.settings.bluetooth.MessageAccessSettings;
 import com.android.settings.deviceinfo.Memory;
 import com.android.settings.fuelgauge.BatterySaverSettings;
 import com.android.settings.fuelgauge.PowerUsageSummary;
@@ -90,6 +91,7 @@ public final class Ranking {
 
         // BT
         sRankMap.put(BluetoothSettings.class.getName(), RANK_BT);
+        sRankMap.put(MessageAccessSettings.class.getName(), RANK_BT);
 
         // DataUsage
         sRankMap.put(DataUsageSummary.class.getName(), RANK_DATA_USAGE);
index 4e35a72..0a3ec2a 100644 (file)
@@ -33,6 +33,7 @@ import com.android.settings.WallpaperTypeSettings;
 import com.android.settings.WirelessSettings;
 import com.android.settings.accessibility.AccessibilitySettings;
 import com.android.settings.bluetooth.BluetoothSettings;
+import com.android.settings.bluetooth.MessageAccessSettings;
 import com.android.settings.deviceinfo.Memory;
 import com.android.settings.fuelgauge.BatterySaverSettings;
 import com.android.settings.fuelgauge.PowerUsageSummary;
@@ -87,6 +88,13 @@ public final class SearchIndexableResources {
                         BluetoothSettings.class.getName(),
                         R.drawable.ic_settings_bluetooth2));
 
+        sResMap.put(MessageAccessSettings.class.getName(),
+                new SearchIndexableResource(
+                        Ranking.getRankForClassName(MessageAccessSettings.class.getName()),
+                        NO_DATA_RES_ID,
+                        MessageAccessSettings.class.getName(),
+                        R.drawable.ic_settings_bluetooth2));
+
         sResMap.put(DataUsageSummary.class.getName(),
                 new SearchIndexableResource(
                         Ranking.getRankForClassName(DataUsageSummary.class.getName()),