OSDN Git Service

Add Screen pinning back to settings
authorJason Monk <jmonk@google.com>
Fri, 18 Jul 2014 13:55:41 +0000 (09:55 -0400)
committerJason Monk <jmonk@google.com>
Mon, 21 Jul 2014 13:01:43 +0000 (09:01 -0400)
Adds a basic screen for screen pinning (previously lock-to-app) to
settings that describes the feature and allows it to be turned on
and off.

Bug: 16378448
Depends on Ide333463f86310eacb7a1d8b6dc7b1aea8722713 for Settings
constant
Change-Id: Id3ef8471794aa01de20efeb947bed95c50d6b954

res/layout/screen_pinning_instructions.xml [new file with mode: 0644]
res/values/dimens.xml
res/values/strings.xml
res/xml/security_settings_misc.xml
src/com/android/settings/ScreenPinningSettings.java [new file with mode: 0644]
src/com/android/settings/SecuritySettings.java
src/com/android/settings/search/Ranking.java
src/com/android/settings/search/SearchIndexableResources.java

diff --git a/res/layout/screen_pinning_instructions.xml b/res/layout/screen_pinning_instructions.xml
new file mode 100644 (file)
index 0000000..22b2b37
--- /dev/null
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 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.
+*/
+-->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/instructions_area"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:paddingStart="@dimen/screen_margin_sides"
+    android:paddingEnd="@dimen/screen_margin_sides">
+
+    <TextView
+        android:id="@+id/screen_pinning_description"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentTop="true"
+        android:paddingTop="@dimen/screen_pinning_textview_padding"
+        android:text="@string/screen_pinning_description"
+        android:textAppearance="@style/TextAppearance.Medium"
+        />
+
+</LinearLayout>
index 2064e19..b7b2af0 100755 (executable)
     <!-- CryptKeeper pattern size for tablet -->
     <dimen name="crypt_keeper_pattern_size">354dip</dimen>
 
+    <!-- Screen pinning textview paddings -->
+    <dimen name="screen_pinning_textview_padding">40dp</dimen>
+
 </resources>
index 90fcf5c..a16c791 100644 (file)
     <!-- Switch On/Off  -->
     <string name="switch_on_text">On</string>
     <string name="switch_off_text">Off</string>
+
+    <!-- [CHAR LIMIT=28] Screen pinning title -->
+    <string name="screen_pinning_title">Screen pinning</string>
+    <!-- [CHAR LIMIT=300] Screen pinning description -->
+    <string name="screen_pinning_description">When this setting is turned on, you can put the device in a state that keeps the current screen in view.\n\nTo pin a screen:\n\n1. Turn this setting on.\n\n2. Open an app.\n\n3. Touch the Recents button.\n\n4. Touch the pin icon.</string>
+
 </resources>
index c8f3e02..1fa8b9a 100644 (file)
         <Preference android:key="sim_lock_settings"
                 android:title="@string/sim_lock_settings_category"
                 android:persistent="false">
+
             <intent android:action="android.intent.action.MAIN"
                     android:targetPackage="com.android.settings"
                     android:targetClass="com.android.settings.IccLockSettings"/>
+
         </Preference>
+
     </PreferenceCategory>
 
     <PreferenceCategory android:title="@string/security_passwords_title"
@@ -35,6 +38,7 @@
         <CheckBoxPreference android:key="show_password"
                 android:title="@string/show_password"
                 android:persistent="false"/>
+
     </PreferenceCategory>
 
     <PreferenceCategory android:key="device_admin_category"
                 android:summaryOff="@string/verify_applications_summary"
                 android:summaryOn="@string/verify_applications_summary"
                 android:persistent="false" />
+
     </PreferenceCategory>
 
     <PreferenceCategory android:key="credentials_management"
             android:title="@string/credentials_title"
             android:persistent="false">
+
         <Preference android:key="credential_storage_type"
                 android:title="@string/credential_storage_type"
                 style="?android:attr/preferenceInformationStyle"
                 android:title="@string/credentials_install"
                 android:summary="@string/credentials_install_summary"
                 android:persistent="false">
+
             <intent android:action="android.credentials.INSTALL"
                     android:targetPackage="com.android.certinstaller"
                     android:targetClass="com.android.certinstaller.CertInstallerMain"/>
+
         </Preference>
 
         <Preference android:key="credentials_reset"
                 android:title="@string/credentials_reset"
                 android:summary="@string/credentials_reset_summary"
                 android:persistent="false">
+
             <intent android:action="com.android.credentials.RESET"
                     android:targetPackage="com.android.settings"
                     android:targetClass="com.android.settings.CredentialStorage"/>
+
         </Preference>
+
     </PreferenceCategory>
 
     <PreferenceCategory android:key="advanced_security"
             android:title="@string/advanced_security_title"
             android:persistent="false">
+
         <Preference android:key="manage_trust_agents"
                 android:title="@string/manage_trust_agents"
                 android:summary="@string/manage_trust_agents_summary"
                 android:persistent="false"
                 android:fragment="com.android.settings.AdvancedSecuritySettings"/>
+
+        <PreferenceScreen
+                android:key="screen_pinning_settings"
+                android:title="@string/screen_pinning_title"
+                android:summary="@string/switch_off_text"
+                android:fragment="com.android.settings.ScreenPinningSettings"/>
+
     </PreferenceCategory>
+
 </PreferenceScreen>
diff --git a/src/com/android/settings/ScreenPinningSettings.java b/src/com/android/settings/ScreenPinningSettings.java
new file mode 100644 (file)
index 0000000..ada5b17
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ * 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;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.provider.Settings.SettingNotFoundException;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Switch;
+
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.Indexable;
+import com.android.settings.search.SearchIndexableRaw;
+import com.android.settings.widget.SwitchBar;
+
+/**
+ * Screen pinning settings.
+ */
+public class ScreenPinningSettings extends SettingsPreferenceFragment
+        implements SwitchBar.OnSwitchChangeListener, Indexable {
+
+    private SwitchBar mSwitchBar;
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        final SettingsActivity activity = (SettingsActivity) getActivity();
+
+        mSwitchBar = activity.getSwitchBar();
+        mSwitchBar.addOnSwitchChangeListener(this);
+        mSwitchBar.show();
+        mSwitchBar.setChecked(isLockToAppEnabled());
+    }
+
+    @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+
+        mSwitchBar.removeOnSwitchChangeListener(this);
+        mSwitchBar.hide();
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        return inflater.inflate(R.layout.screen_pinning_instructions, null);
+    }
+
+    private boolean isLockToAppEnabled() {
+        try {
+            return Settings.System.getInt(getContentResolver(), Settings.System.LOCK_TO_APP_ENABLED)
+                != 0;
+        } catch (SettingNotFoundException e) {
+            return false;
+        }
+    }
+
+    private void setLockToAppEnabled(boolean isEnabled) {
+        Settings.System.putInt(getContentResolver(), Settings.System.LOCK_TO_APP_ENABLED,
+                isEnabled ? 1 : 0);
+    }
+
+    /**
+     * Listens to the state change of the lock-to-app master switch.
+     */
+    @Override
+    public void onSwitchChanged(Switch switchView, boolean isChecked) {
+        setLockToAppEnabled(isChecked);
+    }
+
+    /**
+     * For search
+     */
+    public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+        new BaseSearchIndexProvider() {
+            @Override
+            public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
+                final List<SearchIndexableRaw> result = new ArrayList<SearchIndexableRaw>();
+
+                final Resources res = context.getResources();
+
+                // Add fragment title
+                SearchIndexableRaw data = new SearchIndexableRaw(context);
+                data.title = res.getString(R.string.screen_pinning_title);
+                data.screenTitle = res.getString(R.string.screen_pinning_title);
+                result.add(data);
+
+                // Screen pinning description.
+                data = new SearchIndexableRaw(context);
+                data.title = res.getString(R.string.screen_pinning_description);
+                data.screenTitle = res.getString(R.string.screen_pinning_title);
+                result.add(data);
+
+                return result;
+            }
+        };
+}
index 6961b2a..30fe74a 100644 (file)
@@ -17,8 +17,6 @@
 package com.android.settings;
 
 
-import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
-
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.admin.DevicePolicyManager;
@@ -41,6 +39,7 @@ import android.preference.PreferenceGroup;
 import android.preference.PreferenceScreen;
 import android.provider.SearchIndexableResource;
 import android.provider.Settings;
+import android.provider.Settings.SettingNotFoundException;
 import android.security.KeyStore;
 import android.service.trust.TrustAgentService;
 import android.telephony.TelephonyManager;
@@ -55,6 +54,8 @@ import com.android.settings.search.SearchIndexableRaw;
 import java.util.ArrayList;
 import java.util.List;
 
+import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
+
 /**
  * Gesture lock pattern settings.
  */
@@ -93,6 +94,7 @@ public class SecuritySettings extends SettingsPreferenceFragment
     private static final String KEY_CREDENTIALS_MANAGER = "credentials_management";
     private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive";
     private static final String KEY_TRUST_AGENT = "trust_agent";
+    private static final String KEY_SCREEN_PINNING = "screen_pinning_settings";
 
     private DevicePolicyManager mDPM;
 
@@ -296,6 +298,15 @@ public class SecuritySettings extends SettingsPreferenceFragment
                 root.findPreference(KEY_SIM_LOCK).setEnabled(false);
             }
         }
+        try {
+            if (Settings.System.getInt(getContentResolver(), Settings.System.LOCK_TO_APP_ENABLED)
+                    != 0) {
+                root.findPreference(KEY_SCREEN_PINNING).setSummary(
+                        getResources().getString(R.string.switch_on_text));
+            }
+        } catch (SettingNotFoundException e) {
+            Log.w(TAG, "No Lock-to-app enabled setting", e);
+        }
 
         // Show password
         mShowPassword = (CheckBoxPreference) root.findPreference(KEY_SHOW_PASSWORD);
index ba38d53..96e057e 100644 (file)
@@ -23,6 +23,7 @@ import com.android.settings.DevelopmentSettings;
 import com.android.settings.DeviceInfoSettings;
 import com.android.settings.DisplaySettings;
 import com.android.settings.HomeSettings;
+import com.android.settings.ScreenPinningSettings;
 import com.android.settings.PrivacySettings;
 import com.android.settings.SecuritySettings;
 import com.android.settings.WallpaperTypeSettings;
@@ -129,6 +130,7 @@ public final class Ranking {
         // Security
         sRankMap.put(SecuritySettings.class.getName(), RANK_SECURITY);
         sRankMap.put(ChooseLockGeneric.ChooseLockGenericFragment.class.getName(), RANK_SECURITY);
+        sRankMap.put(ScreenPinningSettings.class.getName(), RANK_SECURITY);
 
         // IMEs
         sRankMap.put(InputMethodAndLanguageSettings.class.getName(), RANK_IME);
index e2b1d48..228381f 100644 (file)
@@ -25,6 +25,7 @@ import com.android.settings.DevelopmentSettings;
 import com.android.settings.DeviceInfoSettings;
 import com.android.settings.DisplaySettings;
 import com.android.settings.HomeSettings;
+import com.android.settings.ScreenPinningSettings;
 import com.android.settings.PrivacySettings;
 import com.android.settings.R;
 import com.android.settings.SecuritySettings;
@@ -207,6 +208,13 @@ public final class SearchIndexableResources {
                         ChooseLockGeneric.ChooseLockGenericFragment.class.getName(),
                         R.drawable.ic_settings_security));
 
+        sResMap.put(ScreenPinningSettings.class.getName(),
+                new SearchIndexableResource(
+                        Ranking.getRankForClassName(ScreenPinningSettings.class.getName()),
+                        NO_DATA_RES_ID,
+                        ScreenPinningSettings.class.getName(),
+                        R.drawable.ic_settings_security));
+
         sResMap.put(InputMethodAndLanguageSettings.class.getName(),
                 new SearchIndexableResource(
                         Ranking.getRankForClassName(InputMethodAndLanguageSettings.class.getName()),