1 /*
2  * Copyright 2013 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.example.android.activityinstrumentation;
18 
19 import android.app.Activity;
20 import android.content.SharedPreferences;
21 import android.os.Bundle;
22 import android.preference.PreferenceManager;
23 import android.view.View;
24 import android.widget.AdapterView;
25 import android.widget.ArrayAdapter;
26 import android.widget.Spinner;
27 
28 import java.util.ArrayList;
29 import java.util.Arrays;
30 
31 /**
32  * Basic activity with a spinner. The spinner should persist its position to disk every time a
33  * new selection is made.
34  */
35 public class MainActivity extends Activity {
36 
37     /** Shared preferences key: Holds spinner position. Must not be negative. */
38     private static final String PREF_SPINNER_POS = "spinner_pos";
39     /** Magic constant to indicate that no value is stored for PREF_SPINNER_POS. */
40     private static final int PREF_SPINNER_VALUE_ISNULL = -1;
41     /** Values for display in spinner. */
42     private static final String[] SPINNER_VALUES = new String[] {
43             "Select Weather...", "Sunny", "Partly Cloudy", "Cloudy", "Rain", "Snow", "Hurricane"};
44 
45     // Constants representing each of the options in SPINNER_VALUES. Declared package-private
46     // so that they can be accessed from our test suite.
47     static final int WEATHER_NOSELECTION = 0;
48     static final int WEATHER_SUNNY = 1;
49     static final int WEATHER_PARTLY_CLOUDY = 2;
50     static final int WEATHER_CLOUDY = 3;
51     static final int WEATHER_RAIN = 4;
52     static final int WEATHER_SNOW = 5;
53     static final int WEATHER_HURRICANE = 6;
54 
55     /** Handle to default shared preferences for this activity. */
56     private SharedPreferences mPrefs;
57     /** Handle to the spinner in this Activity's layout. */
58     private Spinner mSpinner;
59 
60     /**
61      * Setup activity state.
62      *
63      * @param savedInstanceState
64      */
65     @Override
onCreate(Bundle savedInstanceState)66     protected void onCreate(Bundle savedInstanceState) {
67         super.onCreate(savedInstanceState);
68 
69         // Inflate UI from res/layout/activity_main.xml
70         setContentView(R.layout.sample_main);
71 
72         // Get handle to default shared preferences for this activity
73         mPrefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
74 
75         // Populate spinner with sample values from an array
76         mSpinner = (Spinner) findViewById(R.id.spinner);
77         mSpinner.setAdapter(
78                 new ArrayAdapter<String>(
79                         this,                                                   // Context
80                         android.R.layout.simple_list_item_1,                    // Layout
81                         new ArrayList<String>(Arrays.asList(SPINNER_VALUES))    // Data source
82                 ));
83 
84         // Read in a sample value, if it's not set.
85         int selection = mPrefs.getInt(PREF_SPINNER_POS, PREF_SPINNER_VALUE_ISNULL);
86         if (selection != PREF_SPINNER_VALUE_ISNULL) {
87             mSpinner.setSelection(selection);
88         }
89 
90         // Callback to persist spinner data whenever a new value is selected. This will be the
91         // focus of our sample unit test.
92         mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
93 
94             // The methods below commit the ID of the currently selected item in the spinner
95             // to disk, using a SharedPreferences file.
96             //
97             // Note: A common mistake here is to forget to call .commit(). Try removing this
98             // statement and running the tests to watch them fail.
99             @Override
100             public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
101                 mPrefs.edit().putInt(PREF_SPINNER_POS, position).commit();
102             }
103 
104             @Override
105             public void onNothingSelected(AdapterView<?> parent) {
106                 mPrefs.edit().remove(PREF_SPINNER_POS).commit();
107             }
108         });
109     }
110 }
111