package com.RSen.Commandr.ui.activity; import android.app.Activity; import android.app.Fragment; import android.app.FragmentManager; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v13.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBarActivity; import android.text.Editable; import android.text.TextWatcher; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CompoundButton; import android.widget.EditText; import android.widget.ListView; import android.widget.RadioButton; import android.widget.TextView; import com.RSen.Commandr.R; import com.RSen.Commandr.core.MyAccessibilityService; import java.util.ArrayList; import java.util.List; public class SetupActivity extends ActionBarActivity { /** * The {@link android.support.v4.view.PagerAdapter} that will provide * fragments for each of the sections. We use a * {@link FragmentPagerAdapter} derivative, which will keep every * loaded fragment in memory. If this becomes too memory intensive, it * may be best to switch to a * {@link android.support.v13.app.FragmentStatePagerAdapter}. */ SectionsPagerAdapter mSectionsPagerAdapter; /** * The {@link ViewPager} that will host the section contents. */ ViewPager mViewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_setup); // Create the adapter that will return a fragment for each of the three // primary sections of the activity. mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager()); // Set up the ViewPager with the sections adapter. mViewPager = (ViewPager) findViewById(R.id.pager); mViewPager.setAdapter(mSectionsPagerAdapter); } public static class WelcomeFragment extends Fragment { public WelcomeFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.setup_welcome, container, false); return rootView; } } public static class AccessibilityFragment extends Fragment { public AccessibilityFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.setup_accessibility, container, false); final TextView instructions = (TextView) rootView.findViewById(R.id.tV2); final Button openSettings = (Button) rootView.findViewById(R.id.openSettings); final Button limited = (Button) rootView.findViewById(R.id.limited); final Button done = (Button) rootView.findViewById(R.id.done); done.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { PreferenceManager.getDefaultSharedPreferences(getActivity()).edit().putBoolean("setup", true).commit(); Intent main = new Intent(getActivity(), MainActivity.class); startActivity(main); getActivity().finish(); } }); if (MyAccessibilityService.isAccessibilitySettingsOn(getActivity())) { instructions.setText(getString(R.string.accessibility_already_configured)); openSettings.setVisibility(View.GONE); limited.setVisibility(View.GONE); done.setVisibility(View.VISIBLE); } openSettings.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS); startActivityForResult(intent, 2); } }); limited.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { openSettings.setVisibility(View.GONE); limited.setVisibility(View.GONE); instructions.setText(R.string.swipe_left); if (((SetupActivity) getActivity()).mSectionsPagerAdapter.getCount() < 3) { ((SetupActivity) getActivity()).mSectionsPagerAdapter.addItem(new IntentFragment()); ((SetupActivity) getActivity()).mSectionsPagerAdapter.addItem(new TestFragment()); } } }); return rootView; } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 2) { View rootView = getView(); final TextView instructions = (TextView) rootView.findViewById(R.id.tV2); final Button openSettings = (Button) rootView.findViewById(R.id.openSettings); final Button limited = (Button) rootView.findViewById(R.id.limited); final Button done = (Button) rootView.findViewById(R.id.done); if (MyAccessibilityService.isAccessibilitySettingsOn(getActivity())) { instructions.setText(getString(R.string.accessibility_configured)); openSettings.setVisibility(View.GONE); limited.setVisibility(View.GONE); done.setVisibility(View.VISIBLE); } } } } public static class IntentFragment extends Fragment { public IntentFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.setup_intent, container, false); final TextView instructions = (TextView) rootView.findViewById(R.id.tV2); final Button openDialog = (Button) rootView.findViewById(R.id.openDialog); final View divider = rootView.findViewById(R.id.divider); final TextView swipeLeft = (TextView) rootView.findViewById(R.id.swipeLeft); if (checkIfDefault()) { instructions.setText(getString(R.string.default_already_set)); openDialog.setVisibility(View.GONE); divider.setVisibility(View.GONE); swipeLeft.setVisibility(View.VISIBLE); } else { Intent i = new Intent("com.google.android.gm.action.AUTO_SEND"); i.putExtra(Intent.EXTRA_TEXT, "TEST"); i.setType("text/plain"); PackageManager pm = getActivity().getPackageManager(); List<ResolveInfo> resInfo = pm.queryIntentActivities(i, 0); int count = 0; for (ResolveInfo info : resInfo) { if (info.activityInfo.permission == null) { count++; } } if (count < 2) { instructions.setText(getString(R.string.dialog_hidden)); openDialog.setVisibility(View.GONE); divider.setVisibility(View.GONE); swipeLeft.setVisibility(View.VISIBLE); } } openDialog.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent i = new Intent("com.google.android.gm.action.AUTO_SEND"); i.putExtra(Intent.EXTRA_TEXT, "TEST"); i.setType("text/plain"); try { startActivityForResult(i, 1); } catch (Exception e) { instructions.setText(getString(R.string.dialog_hidden)); openDialog.setVisibility(View.GONE); divider.setVisibility(View.GONE); swipeLeft.setVisibility(View.VISIBLE); } } }); return rootView; } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1) { View rootView = getView(); TextView instructions = (TextView) rootView.findViewById(R.id.tV2); Button openDialog = (Button) rootView.findViewById(R.id.openDialog); TextView swipeLeft = (TextView) rootView.findViewById(R.id.swipeLeft); View divider = rootView.findViewById(R.id.divider); if (checkIfDefault()) { instructions.setText(getString(R.string.default_set_successfully)); openDialog.setVisibility(View.GONE); swipeLeft.setVisibility(View.VISIBLE); divider.setVisibility(View.GONE); } } } private boolean checkIfDefault() { Intent i = new Intent("com.google.android.gm.action.AUTO_SEND"); i.putExtra(Intent.EXTRA_TEXT, "TEST"); i.setType("text/plain"); PackageManager pm = getActivity().getPackageManager(); List<ResolveInfo> resInfo = pm.queryIntentActivities(i, 0); if (resInfo.size() < 2) { return true; } final ResolveInfo mInfo = pm.resolveActivity(i, PackageManager.MATCH_DEFAULT_ONLY); try { return mInfo.activityInfo.packageName.equals("com.RSen.Commandr"); } catch (Exception e) { return false; } } } public static class TestFragment extends Fragment { public TestFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.setup_test, container, false); final TextView swipeLeft = (TextView) rootView.findViewById(R.id.swipeLeft); final EditText testInput = (EditText) rootView.findViewById(R.id.testInput); testInput.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { } @Override public void afterTextChanged(Editable editable) { if (editable.toString().toLowerCase().trim().equals(getString(R.string.test_correct_answer))) { testInput.setBackgroundColor(Color.GREEN); if (swipeLeft.getVisibility() != View.VISIBLE) { swipeLeft.setVisibility(View.VISIBLE); ((SetupActivity) getActivity()).mSectionsPagerAdapter.addItem(new PassthroughFragment()); } } else { testInput.setBackgroundColor(Color.RED); if (editable.toString().toLowerCase().trim().equals("pause music")) { testInput.setError(getString(R.string.reminder_note_to_self)); } if (editable.toString().contains(",") || editable.toString().contains("\"") || editable.toString().contains(".")) { testInput.setError(getString(R.string.no_punctuation)); } } } }); return rootView; } } public static class PassthroughFragment extends Fragment { public PassthroughFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.setup_passthrough, container, false); Intent i = new Intent("com.google.android.gm.action.AUTO_SEND"); i.putExtra(Intent.EXTRA_TEXT, "TEST"); i.setType("text/plain"); List<ResolveInfo> resInfo = getActivity().getPackageManager().queryIntentActivities(i, PackageManager.MATCH_DEFAULT_ONLY); if (resInfo.size() < 2) { ListView listView = ((ListView) rootView.findViewById(R.id.listView)); listView.setAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, new String[]{"No note-taking apps found..."})); rootView.findViewById(R.id.done).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { PreferenceManager.getDefaultSharedPreferences(getActivity()).edit().putBoolean("setup", true).commit(); Intent main = new Intent(getActivity(), MainActivity.class); startActivity(main); getActivity().finish(); } }); } else { ResolveInfo[] resInfoArray = new ResolveInfo[resInfo.size() - 1]; int index = 0; for (ResolveInfo resolveInfo : resInfo) { if (!resolveInfo.activityInfo.packageName.equals(getActivity().getPackageName())) { resInfoArray[index] = resolveInfo; index++; } } final ResolveInfoAdapter adapter = new ResolveInfoAdapter(getActivity(), resInfoArray); ListView listView = ((ListView) rootView.findViewById(R.id.listView)); listView.setAdapter(adapter); rootView.findViewById(R.id.done).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { PreferenceManager.getDefaultSharedPreferences(getActivity()).edit().putBoolean("setup", true).putString("passthrough_pkg", adapter.getSelectedPackageName()).commit(); Intent main = new Intent(getActivity(), MainActivity.class); startActivity(main); getActivity().finish(); } }); } return rootView; } public static class ResolveInfoAdapter extends ArrayAdapter<ResolveInfo> { private final Context context; private final ResolveInfo[] values; private int selectedPosition = 0; public ResolveInfoAdapter(Context context, ResolveInfo[] values) { super(context, R.layout.setup_passthrough_row, values); this.context = context; this.values = values; } @Override public View getView(final int position, View convertView, ViewGroup parent) { if (convertView == null) { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.setup_passthrough_row, parent, false); } TextView tv = (TextView) convertView.findViewById(R.id.tV); RadioButton radioButton = (RadioButton) convertView.findViewById(R.id.radioButton); radioButton.setChecked(position == selectedPosition); radioButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { if (b && selectedPosition != position) { selectedPosition = position; notifyDataSetChanged(); } } }); ResolveInfo info = values[position]; tv.setText(info.activityInfo.applicationInfo.loadLabel(context.getPackageManager())); Resources r = context.getResources(); int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 40, r.getDisplayMetrics()); Drawable icon = info.loadIcon(context.getPackageManager()); icon.setBounds(0, 0, px, px); tv.setCompoundDrawables(icon, null, null, null); return convertView; } public String getSelectedPackageName() { return values[selectedPosition].activityInfo.packageName; } } } /** * A {@link FragmentPagerAdapter} that returns a fragment corresponding to * one of the sections/tabs/pages. */ public class SectionsPagerAdapter extends FragmentPagerAdapter { ArrayList<Fragment> fragments = new ArrayList<Fragment>(); public SectionsPagerAdapter(FragmentManager fm) { super(fm); fragments.add(new WelcomeFragment()); fragments.add(new AccessibilityFragment()); } @Override public Fragment getItem(int position) { return fragments.get(position); } @Override public int getCount() { return fragments.size(); } public void addItem(Fragment fragment) { fragments.add(fragment); notifyDataSetChanged(); } } }