/* * Tencent is pleased to support the open source community by making * Tencent GT (Version 2.4 and subsequent versions) available. * * Notwithstanding anything to the contrary herein, any previous version * of Tencent GT shall not be subject to the license hereunder. * All right, title, and interest, including all intellectual property rights, * in and to the previous version of Tencent GT (including any and all copies thereof) * shall be owned and retained by Tencent and subject to the license under the * Tencent GT End User License Agreement (http://gt.qq.com/wp-content/EULA_EN.html). * * Copyright (C) 2015 THL A29 Limited, a Tencent company. All rights reserved. * * Licensed under the MIT License (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of the License at * * http://opensource.org/licenses/MIT * * 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.tencent.wstt.gt.plugin.gps; import java.io.File; import android.annotation.SuppressLint; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.tencent.wstt.gt.R; import com.tencent.wstt.gt.activity.GTBaseActivity; import com.tencent.wstt.gt.api.utils.Env; import com.tencent.wstt.gt.plugin.PluginManager; import com.tencent.wstt.gt.utils.ToastUtil; @SuppressLint("HandlerLeak") public class GTGPSActivity extends GTBaseActivity implements OnItemLongClickListener, GPSRecordListener, GPSReplayListener { private TextView back_gt; private TextView tv_record; private TextView tv_replay; private TextView tv_tag; // 在最近的版本没啥用了 private ListView lv_gpsFile; private Handler handler; public static final String LOG_TAG = "GTGPSActivity"; private static final String MOCK_GPS_PROVIDER_INDEX = "GpsMockProviderIndex"; private static int mMockGpsProviderIndex = 0; public static final int RES_GPSREPALY_ACTIVITY = 200; public Context myself = this; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.pi_gps); // 恢复因GT crash而中断的模拟位置点 if (savedInstanceState instanceof Bundle) { mMockGpsProviderIndex = savedInstanceState.getInt( MOCK_GPS_PROVIDER_INDEX, 0); } back_gt = (TextView) findViewById(R.id.frame_back_gt); back_gt.setOnClickListener(back); tv_record = (TextView) findViewById(R.id.record); tv_replay = (TextView) findViewById(R.id.replay); tv_tag = (TextView) findViewById(R.id.tag); lv_gpsFile = (ListView) findViewById(R.id.gpslist); initListView(); handler = new Handler() { @Override public void handleMessage(Message msg) { // 通知UI刷新 ArrayAdapter<String> adapter = new ArrayAdapter<String>( GTGPSActivity.this, android.R.layout.simple_list_item_single_choice, GTGPSUtils.getGPSFileList()); lv_gpsFile.setAdapter(adapter); if (GTGPSReplayEngine.getInstance().selectedItemPos > 0) { // lv_gpsFile.setItemChecked(GTGPSReplayEngine.getInstance().selectedItemPos, true); Object o = lv_gpsFile.getItemAtPosition(GTGPSReplayEngine .getInstance().selectedItemPos); GTGPSReplayEngine.getInstance().selectedItem = o.toString(); } } }; if (GTGPSRecordEngine.getInstance().isRecord()) { tv_record.setBackgroundResource(R.drawable.switch_off_border); tv_record.setText(getString(R.string.pi_gps_record_stop)); } else { tv_record.setBackgroundResource(R.drawable.switch_on_border); tv_record.setText(getString(R.string.pi_gps_record)); } if (GTGPSReplayEngine.getInstance().isReplay()) { tv_replay.setBackgroundResource(R.drawable.switch_off_border); tv_replay.setText(getString(R.string.pi_gps_replay_stop)); } else { tv_replay.setBackgroundResource(R.drawable.switch_on_border); tv_replay.setText(getString(R.string.pi_gps_replay)); } if (GTGPSReplayEngine.getInstance().selectedItemPos >= 0) { lv_gpsFile .setSelection(GTGPSReplayEngine.getInstance().selectedItemPos); lv_gpsFile.setItemChecked(GTGPSReplayEngine.getInstance().selectedItemPos, true); Object o = lv_gpsFile.getItemAtPosition(GTGPSReplayEngine .getInstance().selectedItemPos); GTGPSReplayEngine.getInstance().selectedItem = o.toString(); } tv_record.setOnClickListener(recordOnClickListener); tv_replay.setOnClickListener(replayOnClickListener); GTGPSRecordEngine.getInstance().addListener(this); GTGPSReplayEngine.getInstance().addListener(this); } @Override public void onSaveInstanceState(Bundle savedInstanceState) { savedInstanceState.putInt(MOCK_GPS_PROVIDER_INDEX, mMockGpsProviderIndex); super.onSaveInstanceState(savedInstanceState); } @Override protected void onDestroy() { GTGPSRecordEngine.getInstance().removeListener(this); GTGPSReplayEngine.getInstance().removeListener(this); handler.removeCallbacksAndMessages(null); super.onDestroy(); } private OnClickListener back = new OnClickListener() { @Override public void onClick(View v) { finish(); } }; private OnClickListener recordOnClickListener = new OnClickListener() { @Override public void onClick(View v) { if (!GTGPSRecordEngine.getInstance().isRecord()) { PluginManager.getInstance().getPluginControler() .startService(GTGPSRecordEngine.getInstance()); } else { PluginManager.getInstance().getPluginControler() .stopService(GTGPSRecordEngine.getInstance()); } } }; private OnClickListener replayOnClickListener = new OnClickListener() { @Override public void onClick(View v) { if (!GTGPSReplayEngine.getInstance().isReplay()) { Intent intent = new Intent(); intent.putExtra("seq", GTGPSReplayEngine.getInstance().selectedItemPos); PluginManager.getInstance().getPluginControler() .startService(GTGPSReplayEngine.getInstance(), intent); } else { PluginManager.getInstance().getPluginControler() .stopService(GTGPSReplayEngine.getInstance()); } } }; @Override public void onRecordStart() { this.runOnUiThread(new Runnable() { @Override public void run() { tv_record.setBackgroundResource(R.drawable.switch_off_border); tv_record.setText(getString(R.string.pi_gps_record_stop)); } }); } @Override public void onRecordStop() { this.runOnUiThread(new Runnable() { @Override public void run() { tv_record.setBackgroundResource(R.drawable.switch_on_border); tv_record.setText(getString(R.string.pi_gps_record)); // 更新UI handler.sendEmptyMessage(0); } }); } @Override public void onRecordFail(final String errorstr) { this.runOnUiThread(new Runnable() { @Override public void run() { ToastUtil.ShowLongToast(GTGPSActivity.this, errorstr); } }); } @Override public void onReplayStart() { this.runOnUiThread(new Runnable() { @Override public void run() { tv_replay.setBackgroundResource(R.drawable.switch_off_border); tv_replay.setText(getString(R.string.pi_gps_replay_stop)); } }); } @Override public void onReplayStop() { this.runOnUiThread(new Runnable() { @Override public void run() { tv_replay.setBackgroundResource(R.drawable.switch_on_border); tv_replay.setText(getString(R.string.pi_gps_replay)); } }); } @Override public void onReplayEnd() { } @Override public void onReplayFail(final String errorstr) { this.runOnUiThread(new Runnable() { @Override public void run() { ToastUtil.ShowLongToast(GTGPSActivity.this, errorstr); } }); } private void initListView() { lv_gpsFile.setChoiceMode(ListView.CHOICE_MODE_SINGLE); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_single_choice, GTGPSUtils.getGPSFileList()); lv_gpsFile.setAdapter(adapter); lv_gpsFile.setOnItemClickListener(listview_listener); lv_gpsFile.setOnItemLongClickListener(this); } OnItemClickListener listview_listener = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapter, View v, int position, long id) { if (!GTGPSReplayEngine.getInstance().isReplay()) { Object o = adapter.getItemAtPosition(position); GTGPSReplayEngine.getInstance().selectedItem = o.toString(); GTGPSReplayEngine.getInstance().selectedItemPos = position; } else if (GTGPSReplayEngine.getInstance().selectedItemPos == position) { Intent intent = new Intent(); intent.putExtra("gpsname", GTGPSReplayEngine.getInstance().selectedItem); intent.putExtra("gpspercent", GTGPSReplayEngine.getInstance() .getPercentage()); intent.putExtra("relpayspeed", GTGPSReplayEngine.getInstance() .getReplaySpeed()); intent.setClass(GTGPSActivity.this, GTGPSReplayActivity.class); startActivityForResult(intent, RES_GPSREPALY_ACTIVITY); // startActivity(intent); } } }; @Override public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) { // 如果是回放过程,禁止做文件操作 if (GTGPSReplayEngine.getInstance().isReplay()) { ToastUtil .ShowShortToast(this, getString(R.string.pi_gps_warn_tip3)); return true; } GTGPSReplayEngine.getInstance().selectedItemPos = position; String fName = parent.getItemAtPosition(position).toString(); final File f = new File(Env.ROOT_GPS_FOLDER, fName); // 弹出对话框,询问是否删除 if (f.exists()) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(getString(R.string.operate_tip)); builder.setItems(new String[] { getString(R.string.delete), getString(R.string.rename) }, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case 0: { f.delete(); if (position == GTGPSReplayEngine.getInstance().selectedItemPos) { GTGPSReplayEngine.getInstance().selectedItemPos = -1; } else if (position < GTGPSReplayEngine .getInstance().selectedItemPos) { // 上面的有删除,则记录的已选中Item顺延上移1位 GTGPSReplayEngine.getInstance().selectedItemPos = GTGPSReplayEngine .getInstance().selectedItemPos - 1; } handler.sendEmptyMessage(0); }break; case 1: { final EditText rename = new EditText(getApplicationContext()); new AlertDialog.Builder(myself) .setTitle(getString(R.string.please_enter)) .setIcon(android.R.drawable.ic_dialog_info) .setView(rename) .setPositiveButton( getString(R.string.ok) , new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { f.renameTo(new File(Env.ROOT_GPS_FOLDER, rename.getText().toString()+".gps")); handler.sendEmptyMessage(0); } }) .show(); }break; default: break; } } }); builder.show(); } return true; } /** 接收到上一页传递过来的保存信息 */ protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (resultCode) { case RES_GPSREPALY_ACTIVITY: { /* 结束之前回放的service */ PluginManager.getInstance().getPluginControler().stopService(GTGPSReplayEngine.getInstance()); /* 启动新的回放service */ Intent intent = new Intent(); intent.putExtra("seq", GTGPSReplayEngine.getInstance().selectedItemPos); intent.putExtra("progress", data.getIntExtra("progress", 0)); intent.putExtra("replayspeed", data.getIntExtra("replayspeed", 0)); PluginManager.getInstance().getPluginControler().startService(GTGPSReplayEngine.getInstance(), intent); Toast.makeText(getApplicationContext(), "has GPS replayed on: " + data.getIntExtra("progress", 0) + "%",Toast.LENGTH_SHORT).show(); }break; case RESULT_OK: { super.onActivityResult(requestCode, resultCode, data); } break; default: break; } } }