Add Screen pinning back to settings

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
This commit is contained in:
Jason Monk
2014-07-18 09:55:41 -04:00
parent d7bdf17aba
commit 27d7ea56f3
8 changed files with 209 additions and 2 deletions

View File

@@ -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>

View File

@@ -183,4 +183,7 @@
<!-- CryptKeeper pattern size for tablet --> <!-- CryptKeeper pattern size for tablet -->
<dimen name="crypt_keeper_pattern_size">354dip</dimen> <dimen name="crypt_keeper_pattern_size">354dip</dimen>
<!-- Screen pinning textview paddings -->
<dimen name="screen_pinning_textview_padding">40dp</dimen>
</resources> </resources>

View File

@@ -5768,4 +5768,10 @@
<!-- Switch On/Off --> <!-- Switch On/Off -->
<string name="switch_on_text">On</string> <string name="switch_on_text">On</string>
<string name="switch_off_text">Off</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> </resources>

View File

@@ -23,10 +23,13 @@
<Preference android:key="sim_lock_settings" <Preference android:key="sim_lock_settings"
android:title="@string/sim_lock_settings_category" android:title="@string/sim_lock_settings_category"
android:persistent="false"> android:persistent="false">
<intent android:action="android.intent.action.MAIN" <intent android:action="android.intent.action.MAIN"
android:targetPackage="com.android.settings" android:targetPackage="com.android.settings"
android:targetClass="com.android.settings.IccLockSettings"/> android:targetClass="com.android.settings.IccLockSettings"/>
</Preference> </Preference>
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory android:title="@string/security_passwords_title" <PreferenceCategory android:title="@string/security_passwords_title"
@@ -35,6 +38,7 @@
<CheckBoxPreference android:key="show_password" <CheckBoxPreference android:key="show_password"
android:title="@string/show_password" android:title="@string/show_password"
android:persistent="false"/> android:persistent="false"/>
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory android:key="device_admin_category" <PreferenceCategory android:key="device_admin_category"
@@ -58,11 +62,13 @@
android:summaryOff="@string/verify_applications_summary" android:summaryOff="@string/verify_applications_summary"
android:summaryOn="@string/verify_applications_summary" android:summaryOn="@string/verify_applications_summary"
android:persistent="false" /> android:persistent="false" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory android:key="credentials_management" <PreferenceCategory android:key="credentials_management"
android:title="@string/credentials_title" android:title="@string/credentials_title"
android:persistent="false"> android:persistent="false">
<Preference android:key="credential_storage_type" <Preference android:key="credential_storage_type"
android:title="@string/credential_storage_type" android:title="@string/credential_storage_type"
style="?android:attr/preferenceInformationStyle" style="?android:attr/preferenceInformationStyle"
@@ -78,28 +84,42 @@
android:title="@string/credentials_install" android:title="@string/credentials_install"
android:summary="@string/credentials_install_summary" android:summary="@string/credentials_install_summary"
android:persistent="false"> android:persistent="false">
<intent android:action="android.credentials.INSTALL" <intent android:action="android.credentials.INSTALL"
android:targetPackage="com.android.certinstaller" android:targetPackage="com.android.certinstaller"
android:targetClass="com.android.certinstaller.CertInstallerMain"/> android:targetClass="com.android.certinstaller.CertInstallerMain"/>
</Preference> </Preference>
<Preference android:key="credentials_reset" <Preference android:key="credentials_reset"
android:title="@string/credentials_reset" android:title="@string/credentials_reset"
android:summary="@string/credentials_reset_summary" android:summary="@string/credentials_reset_summary"
android:persistent="false"> android:persistent="false">
<intent android:action="com.android.credentials.RESET" <intent android:action="com.android.credentials.RESET"
android:targetPackage="com.android.settings" android:targetPackage="com.android.settings"
android:targetClass="com.android.settings.CredentialStorage"/> android:targetClass="com.android.settings.CredentialStorage"/>
</Preference> </Preference>
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory android:key="advanced_security" <PreferenceCategory android:key="advanced_security"
android:title="@string/advanced_security_title" android:title="@string/advanced_security_title"
android:persistent="false"> android:persistent="false">
<Preference android:key="manage_trust_agents" <Preference android:key="manage_trust_agents"
android:title="@string/manage_trust_agents" android:title="@string/manage_trust_agents"
android:summary="@string/manage_trust_agents_summary" android:summary="@string/manage_trust_agents_summary"
android:persistent="false" android:persistent="false"
android:fragment="com.android.settings.AdvancedSecuritySettings"/> 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> </PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>

View File

@@ -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;
}
};
}

View File

@@ -17,8 +17,6 @@
package com.android.settings; package com.android.settings;
import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
@@ -41,6 +39,7 @@ import android.preference.PreferenceGroup;
import android.preference.PreferenceScreen; import android.preference.PreferenceScreen;
import android.provider.SearchIndexableResource; import android.provider.SearchIndexableResource;
import android.provider.Settings; import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
import android.security.KeyStore; import android.security.KeyStore;
import android.service.trust.TrustAgentService; import android.service.trust.TrustAgentService;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
@@ -55,6 +54,8 @@ import com.android.settings.search.SearchIndexableRaw;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
/** /**
* Gesture lock pattern settings. * 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 KEY_CREDENTIALS_MANAGER = "credentials_management";
private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive"; 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_TRUST_AGENT = "trust_agent";
private static final String KEY_SCREEN_PINNING = "screen_pinning_settings";
private DevicePolicyManager mDPM; private DevicePolicyManager mDPM;
@@ -296,6 +298,15 @@ public class SecuritySettings extends SettingsPreferenceFragment
root.findPreference(KEY_SIM_LOCK).setEnabled(false); 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 // Show password
mShowPassword = (CheckBoxPreference) root.findPreference(KEY_SHOW_PASSWORD); mShowPassword = (CheckBoxPreference) root.findPreference(KEY_SHOW_PASSWORD);

View File

@@ -23,6 +23,7 @@ import com.android.settings.DevelopmentSettings;
import com.android.settings.DeviceInfoSettings; import com.android.settings.DeviceInfoSettings;
import com.android.settings.DisplaySettings; import com.android.settings.DisplaySettings;
import com.android.settings.HomeSettings; import com.android.settings.HomeSettings;
import com.android.settings.ScreenPinningSettings;
import com.android.settings.PrivacySettings; import com.android.settings.PrivacySettings;
import com.android.settings.SecuritySettings; import com.android.settings.SecuritySettings;
import com.android.settings.WallpaperTypeSettings; import com.android.settings.WallpaperTypeSettings;
@@ -129,6 +130,7 @@ public final class Ranking {
// Security // Security
sRankMap.put(SecuritySettings.class.getName(), RANK_SECURITY); sRankMap.put(SecuritySettings.class.getName(), RANK_SECURITY);
sRankMap.put(ChooseLockGeneric.ChooseLockGenericFragment.class.getName(), RANK_SECURITY); sRankMap.put(ChooseLockGeneric.ChooseLockGenericFragment.class.getName(), RANK_SECURITY);
sRankMap.put(ScreenPinningSettings.class.getName(), RANK_SECURITY);
// IMEs // IMEs
sRankMap.put(InputMethodAndLanguageSettings.class.getName(), RANK_IME); sRankMap.put(InputMethodAndLanguageSettings.class.getName(), RANK_IME);

View File

@@ -25,6 +25,7 @@ import com.android.settings.DevelopmentSettings;
import com.android.settings.DeviceInfoSettings; import com.android.settings.DeviceInfoSettings;
import com.android.settings.DisplaySettings; import com.android.settings.DisplaySettings;
import com.android.settings.HomeSettings; import com.android.settings.HomeSettings;
import com.android.settings.ScreenPinningSettings;
import com.android.settings.PrivacySettings; import com.android.settings.PrivacySettings;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.SecuritySettings; import com.android.settings.SecuritySettings;
@@ -207,6 +208,13 @@ public final class SearchIndexableResources {
ChooseLockGeneric.ChooseLockGenericFragment.class.getName(), ChooseLockGeneric.ChooseLockGenericFragment.class.getName(),
R.drawable.ic_settings_security)); 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(), sResMap.put(InputMethodAndLanguageSettings.class.getName(),
new SearchIndexableResource( new SearchIndexableResource(
Ranking.getRankForClassName(InputMethodAndLanguageSettings.class.getName()), Ranking.getRankForClassName(InputMethodAndLanguageSettings.class.getName()),