/* * Copyright 2015. Appsi Mobile * * 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.appsimobile.appsii; import android.app.Fragment; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceFragment; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import com.appsimobile.appsii.dagger.AppInjector; import com.appsimobile.appsii.icontheme.iconpack.AbstractIconPack; import com.appsimobile.appsii.icontheme.iconpack.IconPack; import com.appsimobile.appsii.icontheme.iconpack.IconPackFactory; import com.appsimobile.appsii.icontheme.iconpack.IconPackScanner; import com.appsimobile.appsii.icontheme.iconpack.VoidIconPack; import com.appsimobile.appsii.theme.CustomThemeActivity; import java.util.ArrayList; import javax.inject.Inject; /** * Created by Nick Martens on 6/21/13. */ public class LookAndFeelActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { ActivityUtils.setContentView(this, R.layout.preference_view); Fragment fragment = getFragmentManager().findFragmentByTag("look_and_feel_fragment"); if (fragment == null) { fragment = new LookAndFeelPreferencesFragment(); getFragmentManager().beginTransaction() .add(R.id.container, fragment, "look_and_feel_fragment") .commit(); } ActivityUtils.setupToolbar(this, R.id.toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setTitle(null); } catch (RuntimeException e) { Log.e("LookAndFeelActivity", "error", e); throw e; } } static class IconPackItem { boolean mIsHeader; Drawable mDrawable; String mName; String mType; Uri mUri; } static class IconPackAdapter extends BaseAdapter { private static final int TYPE_PACK = 0; private static final int TYPE_HEADER = 1; private final ArrayList<IconPackItem> mIconPacks = new ArrayList<>(); public void initIconPacks(Context context, ArrayList<IconPack> iconPacks) { mIconPacks.clear(); int count = iconPacks.size(); String lastType = null; for (int i = 0; i < count; i++) { IconPack iconPack = iconPacks.get(i); Uri uri = iconPack.getIconPackUri(); String typeName = uri == null ? "Appsi" : AbstractIconPack.getIconPackTypeIdFromUri(uri); if (!typeName.equals(lastType)) { lastType = typeName; IconPackItem item = new IconPackItem(); item.mIsHeader = true; item.mName = typeName; mIconPacks.add(item); } IconPackItem item = new IconPackItem(); String text = iconPack.loadTitle(context); Drawable icon = iconPack.getIconPackIcon(context); item.mName = text; item.mType = typeName; item.mUri = uri; item.mDrawable = icon; mIconPacks.add(item); } notifyDataSetChanged(); } @Override public int getCount() { return mIconPacks.size(); } @Override public IconPackItem getItem(int position) { return mIconPacks.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { IconPackItem item = mIconPacks.get(position); if (item.mIsHeader) { return getViewHeader(item, convertView, parent); } boolean last = position == mIconPacks.size() - 1; boolean nextIsDivider = last || getItemViewType(position + 1) == TYPE_HEADER; return getViewIconPack(item, convertView, parent, nextIsDivider); } public View getViewHeader(IconPackItem item, View convertView, ViewGroup parent) { // Context context = parent.getContext(); // if (convertView == null) { // LayoutInflater inflater = LayoutInflater.from(context); // convertView = inflater.inflate(R.layout.sidebar_section_grey, parent, false); // } // TextView textView = (TextView) convertView.findViewById(R.id.text); // textView.setText(item.mName); return convertView; } @Override public int getItemViewType(int position) { IconPackItem item = mIconPacks.get(position); if (item.mIsHeader) return TYPE_HEADER; return TYPE_PACK; } @Override public int getViewTypeCount() { return 2; } public View getViewIconPack(IconPackItem item, View convertView, ViewGroup parent, boolean noDivider) { Context context = parent.getContext(); if (convertView == null) { LayoutInflater layoutInflater = LayoutInflater.from(context); convertView = (TextView) layoutInflater.inflate(R.layout.icon_pack_item, parent, false); } Drawable back = null; Drawable icon = item.mDrawable; int dimen = (int) context.getResources().getDimension(R.dimen.small_icon); int padding = (int) (8 * context.getResources().getDisplayMetrics().density); icon.setBounds(0, 0, dimen, dimen); String text = item.mName; ((TextView) convertView).setText(text); ((TextView) convertView).setCompoundDrawables(icon, null, null, null); convertView.setBackgroundDrawable(back); convertView.setPadding(padding, convertView.getPaddingTop(), padding, convertView.getPaddingBottom()); return convertView; } } public static class LookAndFeelPreferencesFragment extends PreferenceFragment implements Preference.OnPreferenceClickListener { private final IconPack mNoIconPack = new VoidIconPack(); Context mContext; Preference mThemeListPreference; @Inject SharedPreferences mPreferences; private Preference mIconThemePreference; private static void sendNotify(Context context, Uri uri) { context.getContentResolver().notifyChange(uri, null); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); AppInjector.inject(this); mContext = getActivity(); addPreferencesFromResource(R.xml.prefs_general); mThemeListPreference = findPreference("pref_appsii_theme"); mThemeListPreference.setOnPreferenceClickListener(this); mIconThemePreference = findPreference("pref_icon_theme"); if (mIconThemePreference != null) { mIconThemePreference.setOnPreferenceClickListener(this); } String iconThemeUriString = mPreferences.getString("pref_icon_theme", null); Uri uri = iconThemeUriString == null ? null : Uri.parse(iconThemeUriString); updateSummary(uri); } private void updateSummary(Uri uri) { if (mIconThemePreference == null) return; if (uri != null) { IconPack iconPack = IconPackFactory.createIconPack(uri); mIconThemePreference.setSummary(iconPack.loadTitle(getActivity())); } else { mIconThemePreference.setSummary(R.string.icon_pack_none); } } @Override public boolean onPreferenceClick(Preference preference) { if ("pref_appsii_theme".equals(preference.getKey())) { openThemeEditor(); } else { showIconPackPicker(); } return true; } public void openThemeEditor() { Intent intent = new Intent(getActivity(), CustomThemeActivity.class); startActivity(intent); } private void showIconPackPicker() { Context context = getActivity(); IconPackScanner scanner = IconPackScanner.iconPackScanner(context); ArrayList<IconPack> iconPacks = scanner.getIconPacks(); iconPacks.add(0, mNoIconPack); AlertDialog.Builder builder = new AlertDialog.Builder(context); final IconPackAdapter iconPackAdapter = new IconPackAdapter(); iconPackAdapter.initIconPacks(context, iconPacks); builder.setAdapter(iconPackAdapter, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); IconPackItem iconPack = iconPackAdapter.getItem(which); onIconPackPicked(iconPack); } }); builder.setTitle(R.string.pref_icon_theme_name); AlertDialog dialog = builder.show(); dialog.getListView().setDivider(null); } void onIconPackPicked(IconPackItem iconPack) { Uri uri = iconPack.mUri; mIconThemePreference.setSummary(iconPack.mName); String stringUri = uri == null ? null : uri.toString(); SharedPreferences.Editor editor = mPreferences.edit(); if (stringUri == null) { editor.remove("pref_icon_theme"); } else { editor.putString("pref_icon_theme", stringUri); } editor.apply(); } } }