Fix 3148496: Update LockPatternTutorial to be one screen.

This combines the two activities ChooseLockPatternExample and
ChooseLockPatternTutorial into one activity and makes use of the
built-in LockPatternView animation to show an example view.

Change-Id: If3a4b236a15a6d99b1c0b5c11e5e923267fa30d3
This commit is contained in:
Jim Miller
2010-12-21 22:03:06 -08:00
parent 39ef225e7c
commit 9709625874
6 changed files with 177 additions and 133 deletions

View File

@@ -735,9 +735,6 @@
<activity android:name="ChooseLockPatternTutorial" <activity android:name="ChooseLockPatternTutorial"
android:label="@string/lockpassword_choose_your_pattern_header"/> android:label="@string/lockpassword_choose_your_pattern_header"/>
<activity android:name="ChooseLockPatternExample"
android:label="@string/lockpassword_choose_your_pattern_header"/>
<!-- Runs in the phone process since it needs access to the Phone object --> <!-- Runs in the phone process since it needs access to the Phone object -->
<activity android:name=".deviceinfo.Status" <activity android:name=".deviceinfo.Status"
android:label="@string/device_status_activity_title" android:label="@string/device_status_activity_title"

View File

@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 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.
-->
<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/topLayout"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="1">
<!-- left side: lock pattern -->
<com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
android:layout_width="354dip"
android:layout_height="354dip"
android:layout_gravity="center_horizontal"
android:layout_marginTop="72dip"
android:layout_marginLeft="111dip"
aspect="square"/>
<!-- right side: instructions and buttons -->
<!-- header message -->
<TextView android:id="@+id/headerText"
android:layout_width="542dip"
android:layout_height="wrap_content"
android:layout_marginTop="88dip"
android:layout_alignParentTop="true"
android:layout_toRightOf="@id/lockPattern"
android:layout_marginLeft="100dip"
android:text="@string/lock_intro_message"
android:textSize="22sp"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:orientation="horizontal">
<!-- left / top button: skip, or re-try -->
<Button android:id="@+id/skip_button"
android:layout_width="140dip"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:singleLine="true"
android:text="@string/lockpattern_tutorial_cancel_label"/>
<!-- right / bottom button: confirm or ok -->
<Button android:id="@+id/next_button"
android:layout_width="140dip"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:singleLine="true"
android:text="@string/lockpattern_tutorial_continue_label"/>
</LinearLayout>
</RelativeLayout>
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>

View File

@@ -0,0 +1,75 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 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.
-->
<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/topLayout"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal">
<!-- top: instructions and buttons -->
<!-- header message -->
<TextView android:id="@+id/headerText"
android:layout_width="542dip"
android:layout_height="78dip"
android:layout_marginTop="96dip"
android:textSize="22sp"
android:text="@string/lock_intro_message"/>
<!-- bottom: lock pattern -->
<com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
android:layout_width="354dip"
android:layout_height="354dip"
android:layout_marginTop="80dip"
aspect="square"/>
<View
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:orientation="horizontal">
<!-- left / top button: skip, or re-try -->
<Button android:id="@+id/skip_button"
android:layout_width="140dip"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:singleLine="true"
android:text="@string/lockpattern_tutorial_cancel_label"/>
<!-- right / bottom button: confirm or ok -->
<Button android:id="@+id/next_button"
android:layout_width="140dip"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:singleLine="true"
android:text="@string/lockpattern_tutorial_continue_label"/>
</LinearLayout>
</RelativeLayout>
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>

View File

@@ -720,6 +720,12 @@
<!-- Label for ChoosePassword/PIN OK button --> <!-- Label for ChoosePassword/PIN OK button -->
<string name="lockpassword_cancel_label">Cancel</string> <string name="lockpassword_cancel_label">Cancel</string>
<!-- Label for LockPatternTutorial Cancel button -->
<string name="lockpattern_tutorial_cancel_label">Cancel</string>
<!-- Label for LockPatternTutorial Continue button -->
<string name="lockpattern_tutorial_continue_label">Next</string>
<!-- In the security screen, the header title for settings related to device admins --> <!-- In the security screen, the header title for settings related to device admins -->
<string name="device_admin_title">Device administration</string> <string name="device_admin_title">Device administration</string>
@@ -1875,12 +1881,8 @@
<!-- ChooseLockPatternTutorial, tutorial screen title --> <!-- ChooseLockPatternTutorial, tutorial screen title -->
<string name="lock_title" product="default">Securing your phone</string> <string name="lock_title" product="default">Securing your phone</string>
<!-- ChooseLockPatternTutorial, tutorial screen text --> <!-- ChooseLockPatternTutorial, tutorial screen text -->
<string name="lock_intro_message" product="tablet"><font size="17">Protect your tablet from unauthorized use by creating a personal screen unlock pattern. <string name="lock_intro_message" product="tablet">Protect your tablet from unauthorized use by creating a personal screen unlock pattern. Use your finger to connect the dots in any order on the next screen. You must connect at least four dots.
\n<font height="17">\n</font><b>1</b>\u00A0 On the next screen, watch while an example pattern is drawn. \n\nReady to start? Touch \u201CNext\u201D.
\n<font height="17">\n</font><b>2</b>\u00A0 When ready, draw your own personal unlock pattern. Experiment with different patterns but connect at least four dots.
\n<font height="17">\n</font><b>3</b>\u00A0 Redraw your pattern to confirm.
\n<font height="17">\n</font><b>Ready to start? Touch \u201CNext\u201D</b>.
\n<font height="3">\n</font>To leave your tablet unprotected, touch \u201CCancel\u201D.</font>
</string> </string>
<!-- ChooseLockPatternTutorial, tutorial screen text --> <!-- ChooseLockPatternTutorial, tutorial screen text -->
<string name="lock_intro_message" product="default"><font size="17">Protect your phone from unauthorized use by creating a personal screen unlock pattern. <string name="lock_intro_message" product="default"><font size="17">Protect your phone from unauthorized use by creating a personal screen unlock pattern.
@@ -1891,14 +1893,6 @@
\n<font height="3">\n</font>To leave your phone unprotected, touch \u201CCancel\u201D.</font> \n<font height="3">\n</font>To leave your phone unprotected, touch \u201CCancel\u201D.</font>
</string> </string>
<!-- ChooseLockPatternExample --> <skip />
<!-- ChooseLockPatternExample, screen title that shows an example pattern -->
<string name="lock_example_title">Example pattern</string>
<!-- ChooseLockPatternExample, screen hint text at bottom of screen. These are instructions and rules for drawing a good patttern -->
<string name="lock_example_message">Connect at least four dots.\n
\nTouch \u201CNext\u201D when you\u2019re ready to draw your own pattern.
</string>
<!-- Applications Settings --> <skip /> <!-- Applications Settings --> <skip />
<!-- Applications settings screen, setting option name for the user to go to the screen to manage installed applications --> <!-- Applications settings screen, setting option name for the user to go to the screen to manage installed applications -->
<string name="manageapplications_settings_title">Manage applications</string> <string name="manageapplications_settings_title">Manage applications</string>

View File

@@ -1,115 +0,0 @@
/*
* Copyright (C) 2008 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 android.app.Fragment;
import android.content.Intent;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
public class ChooseLockPatternExample extends PreferenceActivity {
// required constructor for fragments
public ChooseLockPatternExample() {
}
@Override
public Intent getIntent() {
Intent modIntent = new Intent(super.getIntent());
modIntent.putExtra(EXTRA_SHOW_FRAGMENT, ChooseLockPatternExampleFragment.class.getName());
modIntent.putExtra(EXTRA_NO_HEADERS, true);
return modIntent;
}
public static class ChooseLockPatternExampleFragment extends Fragment
implements View.OnClickListener {
private static final long START_DELAY = 1000;
protected static final String TAG = "Settings";
private View mNextButton;
private View mSkipButton;
private View mImageView;
private AnimationDrawable mAnimation;
private Handler mHandler = new Handler();
private Runnable mRunnable = new Runnable() {
public void run() {
startAnimation(mAnimation);
}
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.choose_lock_pattern_example, null);
mNextButton = view.findViewById(R.id.next_button);
mNextButton.setOnClickListener(this);
mSkipButton = view.findViewById(R.id.skip_button);
mSkipButton.setOnClickListener(this);
mImageView = (ImageView) view.findViewById(R.id.lock_anim);
mImageView.setBackgroundResource(R.drawable.lock_anim);
mImageView.setOnClickListener(this);
mAnimation = (AnimationDrawable) mImageView.getBackground();
return view;
}
@Override
public void onResume() {
super.onResume();
mHandler.postDelayed(mRunnable, START_DELAY);
}
@Override
public void onPause() {
super.onPause();
stopAnimation(mAnimation);
}
public void onClick(View v) {
if (v == mSkipButton) {
// Canceling, so finish all
getActivity().setResult(ChooseLockPattern.RESULT_FINISHED);
getActivity().finish();
} else if (v == mNextButton) {
stopAnimation(mAnimation);
Intent intent = new Intent(getActivity(), ChooseLockPattern.class);
intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
intent.putExtra("confirm_credentials", false);
startActivity(intent);
getActivity().finish();
}
}
protected void startAnimation(final AnimationDrawable animation) {
if (animation != null && !animation.isRunning()) {
animation.run();
}
}
protected void stopAnimation(final AnimationDrawable animation) {
if (animation != null && animation.isRunning()) animation.stop();
}
}
}

View File

@@ -16,7 +16,10 @@
package com.android.settings; package com.android.settings;
import java.util.ArrayList;
import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.LockPatternView;
import android.app.Fragment; import android.app.Fragment;
import android.content.Intent; import android.content.Intent;
@@ -45,6 +48,7 @@ public class ChooseLockPatternTutorial extends PreferenceActivity {
implements View.OnClickListener { implements View.OnClickListener {
private View mNextButton; private View mNextButton;
private View mSkipButton; private View mSkipButton;
private LockPatternView mPatternView;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
@@ -68,6 +72,17 @@ public class ChooseLockPatternTutorial extends PreferenceActivity {
mNextButton.setOnClickListener(this); mNextButton.setOnClickListener(this);
mSkipButton = view.findViewById(R.id.skip_button); mSkipButton = view.findViewById(R.id.skip_button);
mSkipButton.setOnClickListener(this); mSkipButton.setOnClickListener(this);
// Set up LockPatternView to be a non-interactive demo animation
mPatternView = (LockPatternView) view.findViewById(R.id.lockPattern);
ArrayList<LockPatternView.Cell> demoPattern = new ArrayList<LockPatternView.Cell>();
demoPattern.add(LockPatternView.Cell.of(0,0));
demoPattern.add(LockPatternView.Cell.of(0,1));
demoPattern.add(LockPatternView.Cell.of(1,1));
demoPattern.add(LockPatternView.Cell.of(2,1));
mPatternView.setPattern(LockPatternView.DisplayMode.Animate, demoPattern);
mPatternView.disableInput();
return view; return view;
} }
@@ -77,7 +92,7 @@ public class ChooseLockPatternTutorial extends PreferenceActivity {
getActivity().setResult(ChooseLockPattern.RESULT_FINISHED); getActivity().setResult(ChooseLockPattern.RESULT_FINISHED);
getActivity().finish(); getActivity().finish();
} else if (v == mNextButton) { } else if (v == mNextButton) {
Intent intent = new Intent(getActivity(), ChooseLockPatternExample.class); Intent intent = new Intent(getActivity(), ChooseLockPattern.class);
intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
startActivity(intent); startActivity(intent);
getActivity().finish(); getActivity().finish();