1/*
2 * Copyright (C) 2015 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
17package com.android.messaging.ui.appsettings;
18
19import android.app.Fragment;
20import android.content.Context;
21import android.os.Bundle;
22import android.support.v4.app.NavUtils;
23import android.text.TextUtils;
24import android.view.LayoutInflater;
25import android.view.MenuItem;
26import android.view.View;
27import android.view.View.OnClickListener;
28import android.view.ViewGroup;
29import android.widget.ArrayAdapter;
30import android.widget.ListView;
31import android.widget.TextView;
32
33import com.android.messaging.R;
34import com.android.messaging.datamodel.DataModel;
35import com.android.messaging.datamodel.binding.Binding;
36import com.android.messaging.datamodel.binding.BindingBase;
37import com.android.messaging.datamodel.data.SettingsData;
38import com.android.messaging.datamodel.data.SettingsData.SettingsDataListener;
39import com.android.messaging.datamodel.data.SettingsData.SettingsItem;
40import com.android.messaging.ui.BugleActionBarActivity;
41import com.android.messaging.ui.UIIntents;
42import com.android.messaging.util.Assert;
43import com.android.messaging.util.PhoneUtils;
44
45import java.util.ArrayList;
46import java.util.List;
47
48/**
49 * Shows the "master" settings activity that contains two parts, one for application-wide settings
50 * (dubbed "General settings"), and one or more for per-subscription settings (dubbed "Messaging
51 * settings" for single-SIM, and the actual SIM name for multi-SIM). Clicking on either item
52 * (e.g. "General settings") will open the detail settings activity (ApplicationSettingsActivity
53 * in this case).
54 */
55public class SettingsActivity extends BugleActionBarActivity {
56    @Override
57    protected void onCreate(final Bundle savedInstanceState) {
58        super.onCreate(savedInstanceState);
59        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
60
61        // Directly open the detailed settings page as the top-level settings activity if this is
62        // not a multi-SIM device.
63        if (PhoneUtils.getDefault().getActiveSubscriptionCount() <= 1) {
64            UIIntents.get().launchApplicationSettingsActivity(this, true /* topLevel */);
65            finish();
66        } else {
67            getFragmentManager().beginTransaction()
68                    .replace(android.R.id.content, new SettingsFragment())
69                    .commit();
70        }
71    }
72
73    @Override
74    public boolean onOptionsItemSelected(final MenuItem item) {
75        switch (item.getItemId()) {
76        case android.R.id.home:
77            NavUtils.navigateUpFromSameTask(this);
78            return true;
79        }
80        return super.onOptionsItemSelected(item);
81    }
82
83    public static class SettingsFragment extends Fragment implements SettingsDataListener {
84        private ListView mListView;
85        private SettingsListAdapter mAdapter;
86        private final Binding<SettingsData> mBinding = BindingBase.createBinding(this);
87
88        @Override
89        public void onCreate(final Bundle savedInstanceState) {
90            super.onCreate(savedInstanceState);
91            mBinding.bind(DataModel.get().createSettingsData(getActivity(), this));
92            mBinding.getData().init(getLoaderManager(), mBinding);
93        }
94
95        @Override
96        public View onCreateView(final LayoutInflater inflater, final ViewGroup container,
97                final Bundle savedInstanceState) {
98            final View view = inflater.inflate(R.layout.settings_fragment, container, false);
99            mListView = (ListView) view.findViewById(android.R.id.list);
100            mAdapter = new SettingsListAdapter(getActivity());
101            mListView.setAdapter(mAdapter);
102            return view;
103        }
104
105        @Override
106        public void onDestroy() {
107            super.onDestroy();
108            mBinding.unbind();
109        }
110
111        @Override
112        public void onSelfParticipantDataLoaded(SettingsData data) {
113            mBinding.ensureBound(data);
114            mAdapter.setSettingsItems(data.getSettingsItems());
115        }
116
117        /**
118         * An adapter that displays a list of SettingsItem.
119         */
120        private class SettingsListAdapter extends ArrayAdapter<SettingsItem> {
121            public SettingsListAdapter(final Context context) {
122                super(context, R.layout.settings_item_view, new ArrayList<SettingsItem>());
123            }
124
125            public void setSettingsItems(final List<SettingsItem> newList) {
126                clear();
127                addAll(newList);
128                notifyDataSetChanged();
129            }
130
131            @Override
132            public View getView(final int position, final View convertView,
133                    final ViewGroup parent) {
134                View itemView;
135                if (convertView != null) {
136                    itemView = convertView;
137                } else {
138                    final LayoutInflater inflater = (LayoutInflater) getContext()
139                            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
140                    itemView = inflater.inflate(
141                            R.layout.settings_item_view, parent, false);
142                }
143                final SettingsItem item = getItem(position);
144                final TextView titleTextView = (TextView) itemView.findViewById(R.id.title);
145                final TextView subtitleTextView = (TextView) itemView.findViewById(R.id.subtitle);
146                final String summaryText = item.getDisplayDetail();
147                titleTextView.setText(item.getDisplayName());
148                if (!TextUtils.isEmpty(summaryText)) {
149                    subtitleTextView.setText(summaryText);
150                    subtitleTextView.setVisibility(View.VISIBLE);
151                } else {
152                    subtitleTextView.setVisibility(View.GONE);
153                }
154                itemView.setOnClickListener(new OnClickListener() {
155                    @Override
156                    public void onClick(View view) {
157                        switch (item.getType()) {
158                            case SettingsItem.TYPE_GENERAL_SETTINGS:
159                                UIIntents.get().launchApplicationSettingsActivity(getActivity(),
160                                        false /* topLevel */);
161                                break;
162
163                            case SettingsItem.TYPE_PER_SUBSCRIPTION_SETTINGS:
164                                UIIntents.get().launchPerSubscriptionSettingsActivity(getActivity(),
165                                        item.getSubId(), item.getActivityTitle());
166                                break;
167
168                            default:
169                                Assert.fail("unrecognized setting type!");
170                                break;
171                        }
172                    }
173                });
174                return itemView;
175            }
176        }
177    }
178}
179