/* PebbleSettingActivity.java Copyright (c) 2014 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.pebble.setting; import android.annotation.SuppressLint; import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.provider.Settings; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.Toast; import org.deviceconnect.android.deviceplugin.pebble.R; import org.deviceconnect.android.ui.activity.DConnectSettingPageFragmentActivity; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; /** * Pebbleの設定画面. * @author NTT DOCOMO, INC. */ public class PebbleSettingActivity extends DConnectSettingPageFragmentActivity { /** googleStorId. */ private static final String PACKAGE_PEBBLE = "com.getpebble.android.basalt"; /** * フラグメント一覧. */ private List<BaseFragment> mFragments = new ArrayList<BaseFragment>(); @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (mFragments.size() == 0) { mFragments.add(new BluetoothActivationFragment()); mFragments.add(new BluetoothSettingPromptFragment()); mFragments.add(new AppInstrallationFragmentA()); mFragments.add(new AppInstrallationFragmentP()); mFragments.add(new SettingFinishFragment()); } } @Override public int getPageCount() { return 5; } @Override public Fragment createPage(final int position) { return mFragments.get(position); } /** * BaseFragment クラス. * */ public static abstract class BaseFragment extends Fragment { } /** * 手順1 PebbleをBluetooth検出可能にする. */ public static class BluetoothActivationFragment extends BaseFragment { @Override public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { return inflater.inflate(R.layout.dconnect_settings_step_1, container, false); } } /** * 手順2 端末標準の設定画面でPebbleとのペアリングを実行する. */ public static class BluetoothSettingPromptFragment extends BaseFragment { @Override public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { View root = inflater.inflate(R.layout.dconnect_settings_step_2, container, false); Button button = (Button) root.findViewById(R.id.dconnect_settings_step_2_button_launch_bluetooth_setting); button.setOnClickListener(new OnClickListener() { @Override public void onClick(final View v) { startActivity(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS)); } }); return root; } } /** * 手順3 必須アプリのインストール. */ public static class AppInstrallationFragmentA extends BaseFragment { @Override public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { View root = inflater.inflate(R.layout.dconnect_settings_step_3, container, false); Button btn = (Button) root.findViewById(R.id.dconnect_settings_step_3_button_install_pebble); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(final View v) { Uri uri = Uri.parse("market://details?id=" + PACKAGE_PEBBLE); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); } }); return root; } } /** * 手順4 必須アプリのインストール. */ public static class AppInstrallationFragmentP extends BaseFragment { @Override public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { View root = inflater.inflate(R.layout.dconnect_settings_step_4, container, false); Button btn = (Button) root.findViewById(R.id.dconnect_settings_step_4_button_install_plugin); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(final View v) { Activity activity = getActivity(); installPebbleApprication(activity, getPbwFileName(activity)); } }); return root; } } /** * uri で指定した Pebble側アプリケーションをインストールする. * @param uri URI */ private static void installPebbleApprication(final Activity activity, final Uri uri) { try { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri, "application/octet-stream"); activity.startActivity(intent); } catch (ActivityNotFoundException e) { Toast.makeText(activity, R.string.page04_error01, Toast.LENGTH_LONG).show(); } } /** * リソースから pbw ファイルを作成し、その uri を返す. * @return uri を返す. */ @SuppressLint("WorldReadableFiles") @SuppressWarnings("deprecation") private static Uri getPbwFileName(final Activity activity) { File file = activity.getFileStreamPath("dc_pebble.pbw"); try { fileCopy(activity.getResources().openRawResource(R.raw.dc_pebble), activity.openFileOutput(file.getName(), MODE_WORLD_READABLE)); } catch (IOException e) { e.printStackTrace(); } return Uri.fromFile(file); } /** * 手順最終. * */ public static class SettingFinishFragment extends BaseFragment { @Override public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { return inflater.inflate(R.layout.dconnect_settings_step_finish, container, false); } } /** * ファイルをコピーする. * @param is 入力 * @param os 出力 * @throws IOException IO Exception */ private static void fileCopy(final InputStream is, final OutputStream os) throws IOException { byte[] b = new byte[1024]; while (is.read(b) > 0) { os.write(b); } is.close(); os.close(); } }